#ios #swift #uitableview #delegates #segue
#iOS #swift #uitableview #делегаты #segue
Вопрос:
Я столкнулся с проблемой при попытке создать TableView и использовать переход для подготовки следующего UIViewController
экрана.
Итак, с экрана A на экран B на экране B мне нужно отобразить информацию, которая будет определяться пользователем данных, нажатым на экране A.
Вот код на экране ViewController:
extension VehicleListToInsureViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//print(vehicleList[indexPath.row].vehicleName)
performSegue(withIdentifier: Constants.segueVehicleListToPolicyList, sender: self)
tableView.deselectRow(at: indexPath, animated: true)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationVC = segue.destination as! PolicyOptionsViewController
destinationVC.vehicleName = vehicleList[indexPath.row].vehicleName
}
}
Я использую расширение для использования UITableViewDelegate
, но эта строка:
destinationVC.vehicleName = vehicleList[indexPath.row].vehicleName
выдает ошибки:
indexPath is unresolved identifier...
Как я могу это исправить? Я знаю, что это две функции, поэтому я не могу использовать indexPath
, но как можно решить эту проблему, чтобы получить данные vehicleList
?
Ответ №1:
Вместо того, чтобы подключать переход из контроллера, подключите его из ячейки табличного представления к целевому контроллеру.
Преимущество в том, что вы можете удалить
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//print(vehicleList[indexPath.row].vehicleName)
performSegue(withIdentifier: Constants.segueVehicleListToPolicyList, sender: self)
tableView.deselectRow(at: indexPath, animated: true)
}
При prepare(for
вызове sender
параметр содержит cell
и вы можете запросить у табличного представления путь к его индексу
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == Constants.segueVehicleListToPolicyList,
let cell = sender as? UITableViewCell,
let indexPath = tableView.indexPath(for: cell) else { return }
let destinationVC = segue.destination as! PolicyOptionsViewController
destinationVC.vehicleName = vehicleList[indexPath.row].vehicleName
}
Комментарии:
1. Привет, Вадиан, спасибо за ваш ответ. если я удалю didSelectRowAt, у нас не будет функции performSegue. Когда я нажимаю на ячейку, она не выводит меня на следующий экран… поэтому я думаю, что мне все еще нужно сохранить performSegue. предоставленная вами функция подготовки к переходу не содержит ошибок… но vehicleName не получает правильного значения, оно равно нулю…
2. Пожалуйста, перечитайте первое предложение моего ответа. Необходимо повторно подключить переход в Interface Builder.
3. да, моя ошибка! Спасибо, приятель!
Ответ №2:
Вы можете перейти к пути к индексу (или к чему угодно еще, на самом деле) prepareForSegue
через sender
параметр:
performSegue(withIdentifier: Constants.segueVehicleListToPolicyList,
sender: indexPath) // <---- !!
В prepareForSegue
, вы можете попытаться привести sender
к IndexPath
:
if let destinationVC = segue.destination as? PolicyOptionsViewController,
let indexPath = sender as? IndexPath {
destinationVC.vehicleName = vehicleList[indexPath.row].vehicleName
}
В качестве альтернативы, можно напрямую передать vehicleList[indexPath.row].vehicleName
в качестве отправителя и привести к String
:
performSegue(withIdentifier: Constants.segueVehicleListToPolicyList,
sender: vehicleList[indexPath.row].vehicleName)
// ...
if let destinationVC = segue.destination as? PolicyOptionsViewController,
let vehicleName = sender as? String {
destinationVC.vehicleName = vehicleName
}
Комментарии:
1. Спасибо Sweeper за ваш ответ, используя ваше первое решение, я получил инициализатор для условной привязки, который должен иметь необязательный тип, а не ошибку ‘PolicyOptionsViewController’ для строки
if let destinationVC = .....
, 2-е решение, если я изменю функцию performSegue, как вы предложили, что мне делать с функцией подготовки к переходу? слишком много ошибок возникает, если я изменяю функцию performSegue, как вы предложили….2. @Yudi Ой! Были некоторые опечатки. Заменить
!?
на?
.3. Теперь работает, цените это!