#ios #swift #variables #variable-assignment
#iOS #swift #переменные #переменная-назначение
Вопрос:
Вероятно, я здесь упускаю что-то основное, но у меня есть два ViewControllers
вызываемых ListController
параметра (начиная с VC) и ExamplesController
и вызываемая переменная, selectedCell
которая объявляется в ListController
, затем ее значение изменяется в ListController
с помощью tableView
didSelectRowAt indexPath
функции на основе строки, по которой пользователь нажимает. Когда пользователь нажимает на ячейку, ExamplesController
будет представлено (через segue в IB), но значение selectedCell
не меняется, пока я не вернусь к ListController
. Итак, порядок, в котором все выполняется сейчас, таков:
selectedCell
инициализируется значением 0пользователь нажимает на ячейку (скажем, с индексом 3)
ExamplesController
отображается с заголовком 0пользователь возвращается к
ListController
selectedCell
присваивается значение 3
Вот упрощенная версия кода.
var selectedCell = 0
class ListController: UIViewController, UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedCell = indexPath.row
print("Tapped on (selectedCell)")
}
}
class ExamplesController: UIViewController{
@IBOutlet weak var chapterTitle: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
chapterTitle.text = "(chapterTitles[selectedCell])"
}
}
Есть идеи, что я делаю не так?
Комментарии:
1. Привет, Роберт, я делаю это из IB через переход: ibb.co/9T1djy0
2. Если переход к ExamplesController настроен в IB, то он запускается до того, как вызывается
didSelectRowAt
метод делегата, что и является причиной вашей проблемы. На самом деле было бы лучше либо создать segue, а затем просто вызвать его в методе ‘didSelectRowAt’, либо сохранить segue, определенный в IB, и использоватьprepare
метод на контроллере представления, который выполняется до представления второго контроллера представления.3. Я понимаю, спасибо за разъяснение. Я попытался представить VC изнутри функции didSelectRow, и это сработало.
Ответ №1:
Вам нужно подключить переход из самого vc, а не из ячейки, и использовать внутри didSelectRowAt
self.performSegue(withIdentifer:"SegueName",sender:indexPath.row)
func prepare(for segue: UIStoryboardSegue,sender: Any?) {
if segue.identider == "SegueName" {
let des = segue.destination as! ExampleVC
des.selectedCell = sender as! Int
}
}
Комментарии:
1. Большое спасибо. Загрузчик объяснения истины ваше решение помогло мне устранить проблему.