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

Posted

技术标签:

【中文标题】在swift 3中将json id从一个表视图控制器传递到另一个表视图控制器【英文标题】:pass json id from one table view controller into another table view controller in swift 3 【发布时间】:2017-07-18 00:17:20 【问题描述】:

我已经是 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 【参考方案1】:

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

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

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

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

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

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

【讨论】:

以上是关于在swift 3中将json id从一个表视图控制器传递到另一个表视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中将数据从 JSON 传递到表格视图单元格

如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器

无法从 Swift 3 中的 JSON 获取指定值

在 Swift 中将图像视图从一个视图控制器转移到另一个视图控制器

在 swift 5.2 con Alamofire 中将数据(json)传递给另一个控制器

如何在swift 4中将表格视图控制器前面的按钮带到? [重复]