2017-10-26 1 views
0

나는 Swift 언어에 다소 익숙하다. 따라서 Alamofire가 생성 한 온라인 데이터를 한 뷰 컨트롤러의 테이블 뷰에서 다른 뷰 컨트롤러에있는 웹 뷰로 푸시하는 방법에 대한 조언이 필요합니다. 특히 JSON 데이터에는 태그 "url"과 함께 다양한 요소가 있습니다. 내 목표는 셀을 클릭하면 사용자가 새 뷰 컨트롤러의 URL로 이동하도록 해당 url 요소를 적절한 tableview 셀과 일치시키는 것입니다. 이것이 배열과 함께 작동하는 방법을 이해하는 동안, 사용하고있는 JSON 데이터는 사전의 데이터입니다. 그 답례로, 나는 잠시 동안 웹을 검색하여 존재할지도 모르는 튜토리얼을 찾아 보았습니다. 참고로이 게시물에 내 코드를 포함 시켰습니다. 이 문제에 대한 정보는 크게 감사하겠습니다.Alamofire에서 생성 한 데이터를 tableview에서 webview로 푸시하는 방법

class TableViewController: UITableViewController { 
    var responseArray = [[String:Any]]() 
    var mySong = 0 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     Alamofire.request("https://rss.itunes.apple.com/api/v1/us/apple-music/top-songs/all/10/explicit.json").responseJSON { response in 
      if let json = response.result.value as? [String:Any], 
       let feed = json["feed"] as? [String:Any], 
       let results = feed["results"] as? [[String:Any]] { 
       print(results) 
       self.responseArray = results 
       self.tableView.reloadData() 
      } 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return responseArray.count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "top10", for: indexPath) 
     let song = responseArray[indexPath.row] 
     cell.textLabel?.text = song["name"] as? String 
     cell.detailTextLabel?.text = song["artistName"] as? String 
     return cell 
    } 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     mySong = indexPath.row 
     performSegue(withIdentifier: "iTunes", sender: self) 
    } 
} 

답변

0

사전과 거의 비슷한 배열을 사용할 수 있습니다. 차이점은 사전 값을 첨자로 액세스해도 결과가 보장되지 않으므로 반환 값의 유형이 선택 사항이라는 것입니다.

문제로 돌아가서 URL로 이동하는 WebView가있는 다른 ViewController를 열고 싶습니다. 이 URL은 여기를 탐색하기 전에 클릭 한 셀에 의해 결정됩니다.

API에 대해 살펴 보았습니다. 응답에 artistUrl 키로 주어진 웹 페이지를로드하려는 것으로 가정합니다.

는 그냥 didSelectRowAt 방법에 다음 코드를 추가합니다 : 이미 다음 하나가 바로 코드를 조금 수정하면

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    // safely unwrap artistUrl 
    // init WebViewController 
    // set url for WebViewController 
    if let artistUrl = responseArray[indexPath.row]["artistUrl"], let viewController = storyboard?.instantiateViewController(withIdentifier: "WebViewController") as? WebViewController { 
     viewController.url = artistUrl 
     present(viewController, animated: true, completion: nil) 
    } 
} 

는 WebViewController을 확인합니다.

class WebViewController: UIViewController { 

    @IBOutlet weak var webView: UIWebView! 

    var url: String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // safely unwrap url, then convert it to URL 
     if let url = url, let urlForRequest = URL(string: url) { 
      let request = URLRequest(url: urlForRequest) 
      webView.loadRequest(request) 
     } 
    } 
} 

마지막으로,이 API에 대해 모든 URL이 HTTPS임을 확인했습니다. HTTPS가 아닌 경우 plist에서 YES로 설정하려면 AllowArbitraryLoads을 사용해야합니다.

+0

좋아, 약간의 수정이 있었지만 webView를 방문했을 때 내 뒤로 버튼이 사라졌습니다. 참고로 내 뒤로 버튼은 내비게이션 컨트롤러를 통해 내장되어 있습니다. –

+0

탐색 표시 줄을 별도로 추가하여 추가 한 경우 사라질 수 있습니다. 뒤로 버튼과 개인적으로 추가 한 다른 UI 요소를 제거해보십시오. 지금 기본 단추가 표시되는지 확인하십시오. – NSAdi

관련 문제