2016-06-28 2 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가 공백으로 표시됩니다. 두 번째 행을 선택하면 첫 번째 URL, 세 번째 시간 - 두 번째 URL 등이 표시됩니다. MenuTableViewController의 didSelectRowAtIndexPath의 print (valueToPass)가 각 셀에 대해 올바른 URL을 인쇄하지만, 내가 선택한 행을 기반으로하지 않습니다.

답변

1

alamofire가 Asynchronous이고 webView가 전혀로드되지 않은 상태에서 백그라운드 스레드에로드되기 때문입니다. 따라서 처음으로 빈 페이지 등등. 다음 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) 
    } 
    } 

과 :

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

} 
} 

이 문제를 해결해야 당신이 완료 핸들러와 다른 함수에 Request를 작성하고과 같이 viewDidLoad()에 전화를 제안한다. 시험! :)

+0

나는 그것을 시도했지만 여전히 동일하다. 하지만 한 번 행을 선택하고 두 번째 동일한 행을 선택하면 UIWebView에서 올바른 내용을 얻을 수 있다는 것을 깨달았습니다. –