从侧边栏菜单

时间:2016-06-28 15:27:38

标签: ios json swift uiwebview alamofire

我正在尝试根据侧边栏菜单中的选定行在UIWebView中加载网址。对于菜单我正在使用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
}

我从这个View Controller中发出这样的声音:

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
    }

}

这是我在DetailViewController中的代码:

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)
}
}

问题是,当我第一次在菜单中选择任何行时,DetailViewController将显示为空白。当我第二次选择任何一行时,它会给我第一个网址,第三次是第二个网址,依此类推。它不是基于我选择哪一行,尽管MenuTableViewController中didSelectRowAtIndexPath中的print(valueToPass)打印了每个单元格的正确URL。

1 个答案:

答案 0 :(得分:1)

这是因为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{

}
}

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