【问题标题】:pass json id from one table view controller into another table view controller in swift 3在swift 3中将json id从一个表视图控制器传递到另一个表视图控制器
【发布时间】:2023-04-07 03:30:01
【问题描述】:

我已经是 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()
    }
}

【问题讨论】:

  • 第二个表视图是否在不同的 View Controller 中?
  • @Pochi 是的,第一个是:CatMedVC,第二个是:EspMedVC
  • 你是如何转到 EspMedVC 的?
  • @Pochi,老实说,我只将 segue CatMedVC 链接到 main.storyboard 中的 EspMedVC

标签: ios json uitableview segue


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多