【问题标题】:How to get an indexPath of selected row Swift4 JSON如何获取所选行 Swift4 JSON 的 indexPath
【发布时间】:2018-02-02 23:12:59
【问题描述】:

我正在尝试获取详细视图中的标签,其中填充了来自此示例 JSON https://api.myjson.com/bins/18qzq5 的信息,我能够填充 tableView,但未能获取行的 indexPath,并且在 detailView 中我得到了错误“在展开可选值时意外发现 nil”。我在下面列出的代码: * 顺便说一下,我用的是swift解码器

[
  {
    "name": "New York",
    "state": "New York",
    "detail": "The largest city in the US"
  },
  {
    "name": "Los Angeles",
    "state": "California",
    "detail": "Second largest city in the US"
  }
]

tableView的ViewController

import UIKit

struct City: Codable {
    let name: String?
    let state: String?
    let detail: String?
}

class TableVC: UIViewController {

var citiesList: [City] = []
@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    let jsonString = "https://api.myjson.com/bins/18qzq5"

    guard let url = URL(string: jsonString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, error) in

        guard let data = data else {return}

        do {
            let cities = try JSONDecoder().decode([City].self, from: data)

            if cities != nil {
                self.citiesList = cities

            }else{
                print("it's nil")
            }
            print(self.citiesList)

            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        } catch let jsonErr{
            print("error serializing json:", jsonErr)
        }

    }.resume()
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let detailVC = segue.destination as? DetailTaskVC
        let city = sender as AnyObject as? City
        detailVC?.city = city
}

}

extension TableVC: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.textLabel?.text = citiesList[indexPath.row].name
    return cell
}
}

extension TableVC: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "toDetail", sender: citiesList[indexPath.row])
}
}

DetailViewController

import UIKit

class DetailTaskVC: UIViewController {

@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var stateLabel: UILabel!
@IBOutlet weak var detailLabel: UILabel!

var city: City!

override func viewDidLoad() {
    super.viewDidLoad()

    self.nameLabel?.text = city.name //Unexpectedly found nil while unwrapping an Optional value
    self.stateLabel?.text = city.state
    self.detailLabel?.text = city.detail

}
}

希望你们能帮我解决这个问题,或者网上有一个教程,你们可以指出我,因为我搜索了很多,但没有得到肯定的结果。

【问题讨论】:

    标签: json swift4 detailview indexpath


    【解决方案1】:
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let detailVC = segue.destination as? DetailTaskVC
        let city = sender as AnyObject as? City
        detailVC?.city = city
    }
    

    使用sender as? City 而不是sender as AnyObject as? City。您不能将结构转换为 AnyObject。

    【讨论】:

    • 当我 print(city) 为 segue 功能做准备时,它给我带来了这个: Optional(Horizo​​nTest.City(name: Optional("Los Angeles"), state: Optional("California"),详细信息:可选(“美国第二大城市”)))(它打印两个城市的信息)。当我从 tableView 中选择任何城市后在 DetailVC 中执行此操作时,我得到'nil'
    • 你改变了双重演员吗?
    • 是的,我按照你在回答中提到的做了。
    • 尝试使用var city: City?
    • 控制台打印与几分钟前完全相同。在 print(city) 所在的 detailVC 中,xCode 给了我一个警告“表达式隐含地从 'City 强制转换?'到任何”。
    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 2022-01-04
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多