Позволяет будущим поисковикам легко найти этот ответ -
Передача данных между UITableViewController в UIViewController
Метод 1 - использование раскадровки (меньше кода)
Начальная сцена-
Контроллер табличного представления (встроенный в UINavigationController) - это первый ViewController, который мы увидим, когда откроем приложение, мы хотим, чтобы он передавал данные в наш контроллер целевого представления
Контроллер целевого представления - это тот ViewController, которого мы достигнем после выбора ячейки.
В следующем GIF вы можете видеть, что я установил переход из нашего TableViewCellв Controller View Destination, идентификатор перехода будет toDestination
(при перетаскивании не может видеть синюю линию ? удерживая ctrl при этом)
Вот так должна выглядеть ваша сцена раскадровки -
(не забудьте установить идентификатор повторного использования вашей ячейки, чтобы вы могли использовать его позже в коде)
Теперь давайте погрузимся в код:
В нашем TableViewController мы напишем эту функцию:
// Here we're transfering the data we want to our DestinationViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? DestinationViewController{
if let pressedIndexPath = tableView.indexPathForSelectedRow{
// passed string is just some variable I've declared on DestinationViewController
destinationVC.passedString = dataHolder[pressedIndexPath.row]
}
}
}
Когда вы даже вызывали эту функцию? -Я не вызывал его, он вызывается автоматически, потому что я установил переход между нашей ячейкой и нашим DestinationViewController с помощью нашей раскадровки (помните начальную сцену? ...), теперь каждый раз, когда пользователь нажимает эту ячейку, запуск начинается автоматическии эта функция вызывается
Наша сторона DestinationViewController выглядит так -
class DestinationViewController: UIViewController {
@IBOutlet weak var label: UILabel!
var passedString: String!
override func viewDidLoad() {
super.viewDidLoad()
label.text = passedString
}
}
Мы закончили, вот окончательный результат
Полный код:
class TableViewController: UITableViewController {
let dataHolder = ["string1", "string2", "string3", "string4"]
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return dataHolder.count }
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// change "cell" to your cell's reuse identifier
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = dataHolder[indexPath.row]
return cell
}
// Here we're transfering the data we want to our DestinationViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? DestinationViewController{
if let pressedIndexPath = tableView.indexPathForSelectedRow{
destinationVC.passedString = dataHolder[pressedIndexPath.row]
}
}
}
}
А с другой стороны:
class DestinationViewController: UIViewController {
@IBOutlet weak var label: UILabel!
var passedString: String!
override func viewDidLoad() {
super.viewDidLoad()
label.text = passedString
}
}