popViewControllerAnimated: вызывается для UINavigationController, когда происходит существующий переход или презентация - PullRequest
0 голосов
/ 31 марта 2020

У меня есть табличное представление, и как только кто-то нажимает на ячейку, должен появиться контроллер представления. Это код для моего tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) метод:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //previously written code
    navigationController?.popViewController(animated: true)
}

Все работает отлично, за исключением одного случая: как только загрузится представление, я пытаюсь нажать на любую клетку немедленно. В этой ситуации popViewController не выполняется, и я получаю эту ошибку:

popViewControllerAnimated: вызывается для UINavigationController, когда происходит существующий переход или презентация; стек навигации не будет обновлен.

Я знаю, этот вопрос ранее уже появлялся в StackOverflow, но я не нашел другого решения, кроме:

DispatchQueue.main.asyncAfter(deadline: .now() + //time) {
    navigationController?.popViewController(animated: true)
}

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

Есть ли другой способ сделать это? Или как-то получить уведомление, когда переход будет готов, чтобы я мог потом всплыть?

1 Ответ

1 голос
/ 31 марта 2020

Вы можете использовать UIViewController transitionCoordinator.

Его документация гласит:

Когда идет презентация или увольнение, это Метод возвращает объект координатора перехода, связанный с этим переходом. Если нет текущего переходного процесса, связанного с текущим контроллером представления, UIKit проверяет предков контроллера представления для объекта координатора перехода и возвращает этот объект, если он существует. Этот объект можно использовать для создания дополнительных анимаций и синхронизации их с анимациями перехода.

let completion = {
    navigationController?.popViewController(animated: true)
}

guard let coordinator = transitionCoordinator else {
    completion()
    return
}

coordinator.animate(alongsideTransition: nil) { _ in
    completion()
}
...