Во-первых, вы не должны получать значения из ячеек ... получать их из своего источника данных (это то, что вы использовали для установки значений).
Итак, в didSelectRowAt
вместо:
let cell = tableView.cellForRow(at: indexPath)
let favMemory = cell?.textLabel?.text
вы должны сделать:
let favMemory = favourites[indexPath.row]
Однако это не то, что вызывает вашу проблему.
I 'Если предположить, что в вашей раскадровке у вас есть «Show Segue», подключенный из вашей прототипной ячейки к вашей FavouritesViewController
. Если это так, prepare(for segue: ...)
называется до didSelectRowAt
. Чтобы подтвердить это, измените код на:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
selectedRow = indexPath.row
// don't do this
//let cell = tableView.cellForRow(at: indexPath)
//let favMemory = cell?.textLabel?.text
let favMemory = favourites[indexPath.row]
print("In didSelectRowAt --- Setting var selectedNameVC = favMemory: \(favMemory)")
selectedNameVC = favMemory
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? FavouritesViewController {
print("In prepareForSegue --- Setting selectedName in FavouritesViewController = selectedNameVC: \(selectedNameVC)")
destination.row = selectedRow
destination.selectedName = selectedNameVC
}
}
Вот что вы должны увидеть в консоли отладки:
In prepareForSegue --- Setting selectedName in FavouritesViewController = selectedNameVC: nil
In didSelectRowAt --- Setting var selectedNameVC = favMemory: Test
Title has loaded correctly.
Как видите, prepareForSegue
запускается первым, поэтомузначение selectedNameVC
равно nil
(оно еще не установлено).
Чтобы исправить это, вы можете установить переменные в willSelectRowAt
вместо in didSelectRowAt
:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
selectedRow = indexPath.row
let favMemory = favourites[indexPath.row]
selectedNameVC = favMemory
return indexPath
}
Либо создайте свой Segue в раскадровке, но not подключите его к ячейке. Вместо этого дайте ему Идентификатор (например, «ShowFavourites»), и в didSelectRowAt
установите ваши переменные и позвоните performSegue
:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
selectedRow = indexPath.row
let favMemory = favourites[indexPath.row]
selectedNameVC = favMemory
performSegue(withIdentifier: "ShowFavourites", sender: nil)
}