在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 中将图像视图从一个视图控制器转移到另一个视图控制器