Потеря идентификатора строки в таблице перед передачей данных

У меня есть навигационный контроллер, встроенный в VC, который называется UserDashboardVC. Затем у меня есть меню VC, и один вариант открывает другой VC с табличным представлением, ManageAccountVC. Когда я выбираю строку таблицы, я хотел бы, чтобы она разворачивалась и заполняла данные в UserDashboardVC.

Я изо всех сил пытаюсь передать данные обратно в UserDashboardVC, используя раскрутку перехода из ManageAccountVC.

В моем UserDashboardVC (root) у меня есть код перехода отката:

@IBAction func unwindUserDashboardVC(_ unwindSegue: UIStoryboardSegue) {
    userCompanyLabel.text   = PassCompanyOffice}

В моем ManageAccountVC ячейка tableview была подключена к Exit unwindUserDashboardVC, это работает, когда я нажимаю на ячейку, я разворачиваюсь в UserDashboardVC. У меня есть функция в ManageAccountVC для выбора строки:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    PassCompanyOffice = userAccountArray[indexPath.row].companyOffice!
}

У меня также есть функция Prepare в ManageAccountVC, которая, похоже, срабатывает до того, как я получу значение строки:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let ConfirmVC = segue.destination as! UserDashboardVC
        ConfirmVC.PassCompanyOffice = PassCompanyOffice
}

Почему мой этап раскрутки выполняется до того, как будет идентифицирована строка моей ячейки? Как передать обратно свои данные?


person Sebastien Desemberg    schedule 26.09.2019    source источник
comment
Все в коде или вы также используете раскадровку? Изображение венчурных капиталистов в раскадровке может помочь установить контекст.   -  person Tommie C.    schedule 26.09.2019
comment
Вместо раскручивания перехода назначьте закрытие обратного вызова в ManageAccountVC, которое вызывается в viewDidDisappear и передает данные. Размотка нужна только в том случае, если контроллеры не связаны друг с другом напрямую.   -  person vadian    schedule 26.09.2019
comment
@TommieC. Я использую раскадровки   -  person Sebastien Desemberg    schedule 26.09.2019
comment
@vadian сработает ли это, если вернуться к двум венчурным капиталистам? (1) UserDashboardVC › (2) UserMenuVC › (3) ManageAccountVC Tableview включен 3 и необходимо передать данные в 1   -  person Sebastien Desemberg    schedule 26.09.2019
comment
Затем раскрутить segue целесообразно.   -  person vadian    schedule 26.09.2019


Ответы (2)


Вы можете создать член класса для хранения выбранной строки и назначить его в willSelectRow для табличного представления. Затем возьмите значение при подготовке к переходу или в данном случае к переходу раскрутки. Поместите точку останова в переходе раскрутки, чтобы определить состояние выбранной переменной строки перед ее использованием.

Ручной переход

Чтобы отделить действие щелчка по ячейке от перехода, вам нужно будет удалить переход выхода, который вы сделали из ячейки таблицы, к выходу.

Затем создайте ручной переход от контроллера представления к значку выхода. Дайте этому переходу идентификатор, а затем вызовите PerformSegue с идентификатором (используя exitSegueIdentifier)

Таким образом, вы разделите два действия. Вы можете нажать на стол, не выходя. В своей кодовой базе вы можете решить, когда вы хотите вызвать PerformSegue и фактически закрыть VC, используя переход вручную.

person Tommie C.    schedule 26.09.2019
comment
Понятно. Я уточню в своем ответе. Спасибо - person Sebastien Desemberg; 26.09.2019

Как упомянул @Tommie C., моя проблема была с TableViewCell, которая была связана с выходом из раскадровки. Я удалил этот переход и добавил ручной выход, выполнив следующие действия:

введите здесь описание изображения

Убедитесь, что вышеперечисленное стало идентифицируемым, в данном случае это «loadDashboardSegue». Функция Prepare имеет имя идентификатора перехода "loadDashboardSegue":

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "loadDashboardSegue" {
        let ConfirmVC = segue.destination as! UserDashboardVC
        ConfirmVC.PassCompanyOffice = PassCompanyOffice
    }
}

Наконец, вы выполняете переход вручную в строке tableview select:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    PassCompanyOffice = userAccountArray[indexPath.row].companyOffice
    performSegue(withIdentifier:"loadDashboardSegue", sender: self)
}
person Sebastien Desemberg    schedule 26.09.2019