2016-06-28 51 views
0

我想在UIWebView中加載一個URL,基於側欄菜單中的選定行。對於菜單,我使用SWRevealViewController,並使用Alamofire和SwiftyJSON使用JSON加載菜單。它有3行和每行的url。我的菜單代碼如下所示:從邊欄菜單中加載UIWebView中的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 
} 

而且我從這個視圖控制器Segue公司這樣的:

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

這是因爲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{ 

} 
} 

應該解決您的問題。嘗試! :)

+0

我試過了,但它仍然是一樣的。但是我意識到,當我選擇一行然後第二次選擇相同的行時,它會在UIWebView中給我正確的內容 –