我正在尝试根据侧边栏菜单中的选定行在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。
答案 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{
}
}
应该解决你的问题。尝试! :)