2017-07-18 3 views
0

私は非常に同じ問題を抱えていますhere TableViewControllerから別のViewControllerに正しいデータを渡す方法はまだわかりません。私はJSONからデータを取得します。必要なものはすべて持っていますが、最後の行のデータが表示されている行データを選択すると、 TableViewControllerを選択した正確な行についての情報を取得する必要があります。"正しい"データをUITableViewControllerの選択したセルからViewControllerに渡す

import UIKit 

class TableViewController: UITableViewController { 

var TableData:Array<String> = Array <String>() 

func getData(_ link: String) { 
    let url: URL = URL(string: link)! 
    let session = URLSession.shared 
    let request = NSMutableURLRequest(url: url) 
    request.httpMethod = "GET" 
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

    let task = session.dataTask(with: request as URLRequest, completionHandler: { 
     (data, response, error) in 
     guard let _: Data = data , let _: URLResponse = response , error == nil else { 
      return 
     } 
     self.extractJSON(data!) 
    }) 
    task.resume() 
} 

func extractJSON(_ data: Data) { 
    let json: Any? 
    do { 
     json = try JSONSerialization.jsonObject(with: data, options: []) 
    } catch { 
     return 
    } 
    guard let dataList = json as? NSArray else { 
     return 
    } 
    if let countriesList = json as? NSArray { 
     for i in 0 ..< dataList.count { 
      if let countriesObj = countriesList[i] as? NSDictionary { 
       if let countryName = countriesObj["country"] as? String { 
        if let countryCode = countriesObj["code"] as? String { 
         TableData.append(countryName + " [" + countryCode + "]") 
         UserDefaults.standard.set(String(describing: countryName), forKey: "name") 
         UserDefaults.standard.set(String(describing: countryCode), forKey: "code") 
         UserDefaults.standard.synchronize() 
        } 
       } 
      } 
     } 
    } 

    DispatchQueue.main.async(execute: {self.doTableRefresh()}) 
} 

func doTableRefresh() { 
    self.tableView.reloadData() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.delegate = self 
    self.tableView.dataSource = self 
    getData("http://www.kaleidosblog.com/tutorial/tutorial.json") 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSections(in tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return TableData.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    cell.textLabel?.text = TableData[indexPath.row] 

    return cell 
} 
} 
+0

あなたのデータを取得し、私は聞いて申し訳ないが、私はそれを使用する方法を見つけることができませんでした –

答えて

2

あなたのデータを取得し、

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let string = TableData[indexPath.row] 

    let vc = // Your VC From Storyboard 
    vc.data = string // 
    self.navigationController?.pushViewController(vc, animated: true) 
} 
+0

をVCにそれを渡すためにtableViewDidSelectRowAtIndexPathを使用することができます。このコードブロックを使用するにはどうすればよいですか? – VahidGR

+0

このメソッドをどこでも呼び出す必要はありません。 tableView:didSelectRowAtIndexPath:はUITableViewのデリゲートメソッドです。これは、選択が発生したときに呼び出されます。このメソッドは、指定された行が現在選択されていることをデリゲートに通知します。 – luckyShubhra

+0

@VahidGRあなたのコードのどこにでも置くことができます。完了しました!もし役に立ったら回答を受け入れます。 –

0
tableView:didSelectRowAtIndexPath: 

をVCにそれを渡すためにtableViewDidSelectRowAtIndexPathデリゲートメソッド

let string = TableData[indexPath.row] 

を使用することができます指定された行は、現在選択されていることをデリゲートに通知します。 indexPathを使用して、tableViewで新しい選択行を探します。 次のView Controllerでvarを宣言します。

var yourObject:String! 

選択したセルのindexpathを使用して、選択したセルのデータにアクセスし、以後、次のビューコントローラにデータを送信することができます。次のView ControllerのyourObjectにアクセスし、必要なデータを渡します。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
let string = TableData[indexPath.row] 

if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController ") as? SecondViewController { 
    viewController.yourObject = yourObject 
    if let navigator = navigationController { 
     navigator.pushViewController(viewController, animated: true) 
    } 
    } 
} 
関連する問題