Как получить indexPath выбранной строки Swift4 JSON
Я пытаюсь заполнить метки в подробном представлении информацией из этого образца JSON. https://api.myjson.com/bins/18qzq5
Я могу заполнить tableView, но не удается получить indexPath строки и в detailView я получаю сообщение об ошибке "неожиданно обнаружен ноль при развертывании необязательного значения". Код, который я перечислил ниже:
* кстати, я использую быстрый декодер
[
{
"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"
}
]
ViewController для tableView
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
}
}
Надеюсь, вы, ребята, можете мне помочь в этом, или, может быть, есть онлайн-урок, и вы, ребята, можете указать мне, так как я много искал и не дал положительного результата.
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.