Swift 3 - 根据单击的单元格在TableViewController swift文件中设置变量

时间:2017-05-22 05:17:41

标签: ios json uitableview swift3

我正在尝试设置一个字符串,具体取决于单击tableView中的哪个单元格。 BlueLineTableViewController应该捕获用户的点击。

import UIKit

class BlueLineTableViewController: UITableViewController {

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

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

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

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

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

    let station = bluelinestations[indexPath.row]
    cell.textLabel?.text = station.name
    cell.imageView?.image = UIImage(named: station.image)
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let row = indexPath.row
    if row == 0 {
        BlueBelmontTableViewController().feed = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=mykey&mapid=40890&outputType=JSON"
    }
    if row == 1   {
        BlueBelmontTableViewController().feed="http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=mykey&mapid=40820&outputType=JSON"
    }
}

BlueBelmontTableViewController的feed变量应该更改/设置为另一个url,具体取决于BlueLineTableViewController中单击的单元格。

import UIKit

class BlueBelmontTableViewController: UITableViewController {

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

var feed = ""

var dataAvailable = false

var records = [Destinations]()

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

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

    for r in records {
        r.time = ""
        r.destination = ""
    }
}

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

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if (dataAvailable) {
        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
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PlaceholderCell", for: indexPath)
        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] ?? [:]
                    print(json)
                    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.dataAvailable = true
                                DispatchQueue.main.async {
                                    self.tableView.reloadData()
                                }

                            }
                        }
                    }
                }
                catch {
                }
            }
        }
    }
    task.resume()
}
}

我已经尝试在didSelectRowAt方法中设置url,具体取决于在BlueLineTableViewController中可以看到的indexPath.row,但它似乎没有做任何事情。有人知道我会这样做吗?

以下是我项目这一部分的Main.storyboard:

enter image description here

2 个答案:

答案 0 :(得分:3)

您无法传递值,因为您将feed属性设置为BlueBelmontTableViewController的全新实例,而不是使用您拥有的segue在导航堆栈中添加的属性从您的UITableViewCellBlueBelmontTableViewController创建。

您需要做的是覆盖prepareForSegue中的BlueLineTableViewController,将您的值传递给BlueBelmontTableViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as! BlueBelmontTableViewController
    if let indexPath = self.tableView.indexPathForSelectedRow {
        if indexPath.row == 0 {
           vc.feed = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=mykey&mapid=40890&outputType=JSON"
        }
        if indexPath.row == 1   {
            vc.feed = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=mykey&mapid=40820&outputType=JSON"
        }  
    }
}

答案 1 :(得分:0)

而不是

BlueBelmontTableViewController().feed = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=mykey&mapid=40890&outputType=JSON"

使用

self.feed = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=mykey&mapid=40890&outputType=JSON"

因为BlueBelmontTableViewController()正在初始化BlueBelmontTableViewController的新实例,并且您想要更改已有的实例,所以您应该使用self而不是创建新实例。