Здесь я предпочитаю использовать шаблон делегата.
В этом подходе контроллер представления делает себя делегатом каждой ячейки представления таблицы, которую он создает.Он передает Item
в клетку.При нажатии кнопки в ячейке ячейка отправляет Item
обратно в контроллер представления.Таким образом, контроллер представления знает, какой Item
был выбран, и должен быть отправлен следующему контроллеру представления.
Для реализации, начните с объявления переменной в ячейке табличного представления для хранения Item
:
weak var item: Item?
В вашем контроллере представления передайте элемент в ячейку:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//...
cell.item = array[indexPath.row]
//...
}
Затем объявите протокол делегата:
protocol ItemSelectionDelegate {
func itemSelected(_ item: Item)
}
Добавьте переменную этого типав свою пользовательскую ячейку табличного представления, например, так:
weak var delegate: ItemSelectionDelegate?
Сделайте так, чтобы кнопка в ячейке табличного представления вызывала делегата при нажатии, передавая ему элемент:
@IBAction func buttonPressed(_ sender: UIButton) {
if let item = item {
delegate?.itemSelected(item)
}
}
Теперь сделайтеКонтроллер представления соответствует этому протоколу:
class MyViewController: UIViewController, ..., ItemSelectionDelegate {
func itemSelected(_ item: Item) {
//...
}
}
Убедитесь, что контроллер представления установлен как делегат каждой ячейки:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//...
cell.item = array[indexPath.row]
cell.delegate = self
//...
}
Вызовите свой переход, но вместо этого передайте Item
кнопки:
class MyViewController: UIViewController, ..., ItemSelectionDelegate {
func itemSelected(_ item: Item) {
performSegue(withIdentifier: "identifier", sender: item)
}
}
Теперь передайте это следующему контроллеру представления:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "identifier" {
let destinationVC = segue.destination as! ViewController2
destinationVC.selectedItem = sender as? Item
}
}
Это определенно больше работы для настройки, поэтому используйте ее только в том случае, если это имеет смысл для вас.