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

时间:2017-07-18 00:17:20

标签: ios json uitableview segue

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

这是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 String 传递到另一个表视图中以显示之前选择的id的数据...这里我不知道该怎么做...我有json文件等待之前选择的id ..但我不知道如何将其捕获到url

这里是第二个表视图:

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()
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个粗略的指南,请搜索文档中的方法或此处的stackoverflow内的其他问题。

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

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

3)在“CatMedVC”中的tableview中实现“didSelectRow”委托方法,在此方法中,您应该在步骤2中设置变量集。

4)在CatMedVC中实现“prepareForSegue”方法,在应该检索目标VC的实现中,将其转换为“EspMedVC”并从步骤1设置变量。

5)在 EspMedVC 的“viewDidLoad”中,您现在可以使用步骤2中的变量集来查询您的JSON并相应地更新表格视图。