从一个表视图控制器传递json id到swift 3中的另一个表视图控制器3

问题描述:

我已经在swift 3和objetive c中新增了,现在我陷入了如何将每行的id传递给另一个表视图控制器用户点击用户想要去的行。从一个表视图控制器传递json id到swift 3中的另一个表视图控制器3

这里是JSON数据firstFile:

[ 
{"id_categoria":"1","totalRows":"323","nombre_categoria":"Cirug\u00eda"}, 
{"id_categoria":"2","totalRows":"312","nombre_categoria":"Med Interna"}, 
{"id_categoria":"3","totalRows":"6","nombre_categoria":"Anatomia"}, 
{"id_categoria":"4","totalRows":"24","nombre_categoria":"Anestesiologia"}, 
...] 

这是我的第一个表视图控制器:

import UIKit 

class CatMedVC: UIViewController, UITableViewDataSource { 
    @IBAction func volver(_ sender: Any) { } 
    @IBOutlet weak var listaCategoria: UITableView! 

    var fetchedCategoria = [Categoria]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     listaCategoria.dataSource = self 
     parseData() 
    } 

    override var prefersStatusBarHidden: Bool{ 
     return true 
    } 

    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return fetchedCategoria.count 
    } 
    public func tableView(_ tableView: UITableView, cellForRowAt IndexPath: IndexPath) -> 
     UITableViewCell { 
      let cell = listaCategoria.dequeueReusableCell(withIdentifier: "cell") 

      cell?.textLabel?.text = fetchedCategoria[IndexPath.row].esp 
      cell?.detailTextLabel?.text = fetchedCategoria [IndexPath.row].totalRows 

      return cell! 
    } 


    func parseData() { 
     let url = "http://www.url.com/firstFile.php" //in json format 
     var request = URLRequest(url: URL(string: url)!) 
     request.httpMethod = "GET" 

     let configuration = URLSessionConfiguration.default 
     let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) 

     let task = session.dataTask(with: request) { (data, response, error) in 

      if(error != nil) { 
       print("Error") 
      } 
      else { 
       do { 
        let fetchedData = try JSONSerialization.jsonObject(with:data!, options: .mutableLeaves) as! NSArray 
        //print(fetchedData) 

        for eachFetchedCategoria in fetchedData { 
         let eachCategoria = eachFetchedCategoria as! [String : Any] 
         let nombre_categoria = eachCategoria["nombre_categoria"] as! String 
         let totalRows = eachCategoria["totalRows"] as! String 
         let id_categoria = eachCategoria["id_categoria"] as! String 

         self.fetchedCategoria.append(Categoria(nombre_categoria: nombre_categoria, totalRows: totalRows, id_categoria: id_categoria)) 
        } 
        //print(self.fetchedCategoria) 

        self.listaCategoria.reloadData() 
       } 
       catch { 
        print("Error 2") 
       } 
      } 
     } 
     task.resume() 
    } 
} 

class Categoria { 
    var nombre_categoria : String 
    var totalRows : String 
    var id_categoria : String 

    init(nombre_categoria : String, totalRows : String, id_categoria : String) { 
     self.nombre_categoria = nombre_categoria 
     self.totalRows = totalRows 
     self.id_categoria = id_categoria 
    } 
} 

所以我需要的id_categoria字符串传递到另一个表视图来显示数据为以前选择的ID ...在这里我不知道该怎么做...我有json文件等待先前选择的ID ..但我不知道如何将其捕获到网址

这里第二个表视图:

import UIKit 

class EspMedVC: UITableViewController { 

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

    var EspecialidadArray = [String]() 

    @IBAction func volver(_ sender: Any) { 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     get_data_from_url("http://www.url.com/secondFile.php?id=") // Here I need to put the id_categoria String in json format 
    } 

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

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) 
     cell.textLabel?.text = TableData[indexPath.row] 
     return cell 
    } 

    func get_data_from_url(_ 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.extract_json(data!) 
     }) 

     task.resume() 
    } 


    func extract_json(_ data: Data) 
    { 
     let json: Any? 

     do 
     { 
      json = try JSONSerialization.jsonObject(with: data, options: []) 
     } 
     catch 
     { 
      return 
     } 

     guard let data_list = json as? NSArray else 
     { 
      return 
     } 


     if let nombre_especialidad = json as? NSArray 
     { 
      for i in 0 ..< data_list.count 
      { 
       if let nombre_esp_obj = nombre_especialidad[i] as? NSDictionary 
       { 
        if let nombre_especialidad = nombre_esp_obj["subesp"] as? String 
        { 
         if let totalRows = nombre_esp_obj["totalRows"] as? String 
         { 
          TableData.append(nombre_especialidad + " [" + totalRows + "]") 
         } 
        } 
       } 
      } 
     } 
     DispatchQueue.main.async(execute: {self.do_table_refresh()}) 
    } 

    func do_table_refresh() 
    { 
     self.tableView.reloadData() 
    } 
} 
+0

是不同View Controller中的第二个表视图吗? – Pochi

+0

@Pochi是的,第一个是:** CatMedVC **和第二个:** EspMedVC ** –

+0

您如何转移到EspMedVC? – Pochi

这是一个粗略的指南,请搜索文档中的方法或在这里计算器内的其他问题。

1)在您的EspMedVC中添加一个变量,该变量将保存应显示的“id_categoria字符串”。

2)在您的CatMedVC中添加一个变量,该变量将保存用户选择的“id_categoria字符串”。

3)从你的tableview里面的“CatMedVC”贯彻“didSelectRow”委托方法,这种方法中,你应该设置上一步变量集2.

4)实现你CatMedVC里面的“prepareForSegue”方法,在实现内部,你应该检索目的地VC,投它“EspMedVC”,并从步骤1

5)在从的“viewDidLoad中”设置变量EspMedVC你现在可以使用变量集上一步2查询您的JSON并相应地更新表视图。