2016-06-28 7 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 
} 

そして、私はこのようなこのビューコントローラからセグエ:

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が空白になります。 2番目の行を選択すると、最初のURL、3番目のURL、2番目のURLなどが表示されます。 MenuTableViewControllerのdidSelectRowAtIndexPathのprint(valueToPass)が各セルの右のURLを表示しますが、選択する行に基づいていません。

答えて

1

alamofireがAsynchronousで、webViewがまったく読み込まれていない間にバックグラウンドスレッドに読み込まれるためです。したがって、最初の空のページなど。

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()で好きでそれを呼び出す:私はあなたが完了ハンドラで別の関数でRequestを書き、そのようviewDidLoad()でそれを呼び出す示唆

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

} 
} 

はあなたの問題を解決する必要があります。試してみて! :)

+0

私はそれを試しましたが、それはまだ同じです。しかし、私が気づいたのは、行を一度選択してから同じ行を2回選択すると、UIWebViewで正しいコンテンツが得られるということです –

関連する問題