簡體   English   中英

如何獲取選定行的Swift4 JSON的indexPath

[英]How to get an indexPath of selected row Swift4 JSON

我正在嘗試使詳細視圖中的標簽充滿來自此示例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

}
}

希望你們可以幫我解決這個問題,或者在線上有一個教程,你們可以指出我的觀點,因為我搜索了很多內容,但沒有取得積極的結果。

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? City而不是sender as AnyObject as? City sender as AnyObject as? City 您不能將結構轉換為AnyObject。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM