从侧栏菜单中加载错误的URL



我正在尝试基于Sidebar菜单中选定的行中加载UIWebView中的URL。对于菜单,我正在使用SwrevealViewController,并且使用Alamofire和Swiftyjson加载了JSON菜单。它有3行和每个行的URL。我的菜单代码看起来像这样:

import UIKit
import Alamofire
class MenuTableViewController: UITableViewController {
    var valueToPass = String()
    var jsonArray = []
override func viewDidLoad() {
    super.viewDidLoad()
    Alamofire.request(.GET, "my-JSON-URL").responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)
            if let resData = swiftyJsonVar["items"].arrayObject {
                self.jsonArray = resData as! [[String:AnyObject]]
            }
            if self.jsonArray.count > 0 {
                self.tableView.reloadData()
            }
        }
        print(self.jsonArray)
    }
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return (jsonArray.count)
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("DynamicCell", forIndexPath: indexPath)
    let array = jsonArray[indexPath.row]
    cell.textLabel?.text = array["name"] as? String
    return cell
}

和我从这个视图控制器中脱颖而出:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let indexPath = tableView.indexPathForSelectedRow!.row
    var array = jsonArray[indexPath]
    let url = array["url"] as? String
    valueToPass = url!
    print(valueToPass)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
    if (segue.identifier == "showDetail") {
        let viewController = segue.destinationViewController as! UINavigationController
        let targetController = viewController.topViewController as! DetailViewController
        targetController.passedValue = valueToPass
    }
}

这是我的详细代码ViewController:

import UIKit
class DetailViewController: UIViewController {
@IBOutlet weak var webView: UIWebView!
@IBOutlet weak var menuButton: UIBarButtonItem!
var passedValue = String()
override func viewDidLoad() {
    super.viewDidLoad()
    if revealViewController() != nil {
        menuButton.target = revealViewController()
        menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
        self.view.addGestureRecognizer(revealViewController().panGestureRecognizer())
    }
    let url = NSURL (string: passedValue)
    let requestObj = NSURLRequest(URL: url!)
    webView.loadRequest(requestObj)
}
}

问题是,当我第一次选择菜单中的任何一行时,详细信息ViewController将出现空白。当我第二次选择任何行时,它会给我第一个URL,第三次 - 第二个URL等。它不是基于我选择哪一行,尽管MenutableViewController中的DidSelectRowatIndExpath中的print(valuetopass)为每个单元格的正确URL。

这是因为Alamofire是Asynchronous,并且在您的WebView根本根本没有加载时加载在背景线程中。因此,第一次的空页面,依此类推。我建议您用完整处理程序在另一个功能中写下Request,然后在viewDidLoad()中称其为:

 func loadURL(url: String, completion: (isDone: Bool) -> ()){
    Alamofire.request(.GET, url)...
    // code
if self.jsonArray.count > 0 {
                self.tableView.reloadData()
            }
        }
       completion(isDone: true)
        print(self.jsonArray)
    }
    }

然后在viewDidLoad()中称其为:

override func viewDidLoad() {
    super.viewDidLoad()
 loadUrl("Your Url here") { success in
if success{
 self.tableView.reloadData()
}
else{
}
}

应该解决您的问题。尝试!:)

相关内容

  • 没有找到相关文章

最新更新