Назначить содержимое UITableView для подготовки перехода в Swift iOS

#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. Теперь работает, цените это!