Дважды нажмите на ячейку в UITableview, чтобы выполнить переход - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь заставить пользователя перейти к другому контроллеру представления при нажатии на ячейку. В настоящее время я настроил переход к ячейке, перетаскивая элемент управления в раскадровке на контроллер представления, а затем передав следующий код для prepare(for segue...). По сути, есть мои охранные заявления, подтверждающие, что у меня правильный контроллер представления, и затем я передаю объект между ними.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     super.prepare(for: segue, sender: sender)

     switch(segue.identifier ?? "") {

     case "ShowEventDetailsSegue":
        guard let navVC = segue.destination as? UINavigationController else {
            fatalError("Unexpected destination: \(segue.destination)")
        }

        guard let EventDetailViewController = navVC.viewControllers.first as? EventViewController else {
            fatalError("Unexpected navigation view controller: \(String(describing: navVC.viewControllers.first))")
        }

        guard let selectedEventCell = sender as? EventTableViewCell else {
            fatalError("Unexpected sender: \(String(describing: sender))")
        }

        guard let indexPath = tableView.indexPath(for: selectedEventCell) else {
            fatalError("The selected cell is not being displayed by the table")
        }

        let selectedEvent = events[indexPath.section]
        EventDetailViewController.event = selectedEvent


         default:
            fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
     }
 }

Я знаю, что другие люди рекомендуют называть что-то вроде

DispatchQueue.main.async { 
    self.present(myVC, animated: true, completion: nil)
}

(см. здесь и также здесь )

но когда я это делаю, я получаю ошибку «Завершение приложения из-за необработанного исключения« NSInvalidArgumentException », причина:« Приложение пыталось представить модально активный контроллер ».

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

Что также странно, это то, что это только начало происходить. У меня не было этой проблемы до сегодняшнего дня.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Оказывается, стиль выбора моей ячейки установлен в none.

cell.selectionStyle = UITableViewCellSelectionStyle.none

Мне не нужен стиль выбора, поэтому способ обойти это - сделать асинхронный вызов

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    DispatchQueue.main.async {
        self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
    }
}

Теперь это решает проблему,Для получения дополнительной информации, проверьте этот пост.

0 голосов
/ 21 ноября 2018

Итак, что вы делаете:

В tableView didSelectRowAt метод, который вы добавляете:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
}

, который запускает метод delegate:

override func prepare(for segue: UIStoryboardSegue, sender: Any?)

контроллер уже готовится к открытию, и вы программно представляете другой контроллер, который, очевидно, выдаст ошибку.

Либо вы пишете другую логику для программного представления представления в tableView didSelectRowAt, либо вы можете сдвинуть весь код в методе контроллера второго представления viewDidLoad.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...