Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift 3表格视图可切换到多个其他表格视图_Ios_Json_Uitableview_Swift3 - Fatal编程技术网

Ios Swift 3表格视图可切换到多个其他表格视图

Ios Swift 3表格视图可切换到多个其他表格视图,ios,json,uitableview,swift3,Ios,Json,Uitableview,Swift3,我正在构建一个CTA火车追踪应用程序。我有一个包含每条列车线的TableView,我正试图找出如何从单击其中一条列车线的TableView单元格转到显示该特定列车线解析JSON数据(目的站和到达时间)的TableView 我想知道最好的方法是什么;最简单的方法似乎是,对于每条列车线,我将从单击的每个单元格切换到完全不同的表视图,但我不确定这是否有效。否则,我似乎需要以某种方式将信息(如JSON提要地址)从每个单击的单元格传递到目标TableView。有人有什么建议吗?下面是我的代码: 所有列车线

我正在构建一个CTA火车追踪应用程序。我有一个包含每条列车线的TableView,我正试图找出如何从单击其中一条列车线的TableView单元格转到显示该特定列车线解析JSON数据(目的站和到达时间)的TableView

我想知道最好的方法是什么;最简单的方法似乎是,对于每条列车线,我将从单击的每个单元格切换到完全不同的表视图,但我不确定这是否有效。否则,我似乎需要以某种方式将信息(如JSON提要地址)从每个单击的单元格传递到目标TableView。有人有什么建议吗?下面是我的代码:

所有列车线的初始屏幕

import UIKit
import SwiftyJSON

class TableViewController: UITableViewController {

    override func viewWillAppear(_ animated: Bool) {
        self.tabBarController?.navigationItem.title = "CTA Train Tracker"
    }

    // MARK: - Table view data source

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

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "subtitle", for: indexPath)
        let train = trains[indexPath.row]

        cell.textLabel?.text = train.name
        cell.imageView?.image = UIImage(named: train.image)
        return cell
    }

    // MARK: - Navigation

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let indexPath = self.tableView.indexPathForSelectedRow
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.        
    }
}
将JSON解析为TableView

import UIKit

let feed = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=keygoeshere&mapid=41320&outputType=JSON"

class TableViewController: UITableViewController {

    class Destinations {
        var destination: String = ""
        var time: String = ""
    }

    var records = [Destinations]()

    override func viewDidLoad() {
        super.viewDidLoad()
        parseData()
    }

    // MARK: - Table view data source

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

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let destinationRow = records[indexPath.row]

        cell.textLabel?.text = destinationRow.destination
        cell.detailTextLabel?.text = destinationRow.time
        return cell
    }

    func parseData() {
        guard let feedURL = URL(string: feed) else {
            return
        }
        let request = URLRequest(url: feedURL)
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if error != nil {
                print("Error")
            }
            else {
                if let content = data {                    
                    do {
                        let json = try JSONSerialization.jsonObject(with: content, options: []) as? [String:Any] ?? [:]

                        if let ctattimetable = json["ctatt"] as? [String:Any] {
                            if let estArrivalTime = ctattimetable["eta"] as? [[String:Any]] {
                                for item in estArrivalTime {
                                    if let headingTowards = item["destNm"] as? String,
                                        let arrivalTime = item["arrT"] as? String {
                                        let record = Destinations()
                                        record.destination = headingTowards
                                        record.time = arrivalTime
                                        self.records.append(record)
                                    }
                                    self.tableView.reloadData()
                                }
                            }
                        }
                    }
                    catch { /* Handle error */ }
                }
            }
        }
        task.resume()
    }
}

基本上,你已经自己解决了:)

经典的方法是使用带有表视图控制器#1的导航控制器作为其根视图控制器,该控制器显示列车线路列表。配置一个原型单元以显示有关列车线的一般信息。此外,将此单元格的选择序列连接起来,以显示表视图控制器#2

表视图控制器#2可以有一个原型单元格,显示有关目的地的信息(名称和到达时间)

在table view controller#1的
prepare(for:sender:)
中,只需遵循代码模板的注释:
segue。destinationViewController
将是即将显示的table view controller#2。按此方式检索并使用所选列车线的详细信息(所选列车线的目的地列表)对其进行配置

或者你说的“我不确定这是否有效”是什么意思

无论如何,你可以考虑的替代方案(例如,取决于你正在瞄准的屏幕大小)使用拆分视图控制器或单表视图控制器,当你点击一条火车线展开以显示目的地的内联。


可以说,希望这能让你走上正轨。

谢谢!这对了解大局有很大帮助。另外,谢谢你考虑的备选方案和火车双关语:不客气,我很高兴能帮上忙。也感谢你的接受和投票。考虑到这个话题,这个笑话就在盘子里出现了:)。