Я хотел бы предложить другой подход к этой проблеме. Вместо того, чтобы использовать контроллер навигации, чтобы открыть контроллер представления, используйте разматывать сегменты. Это решение имеет несколько, но действительно важных преимуществ:
- Контроллер источника может вернуться к любому другому контроллеру назначения (не только к предыдущему), ничего не зная о пункте назначения.
- Сегменты push и pop определены в раскадровке, поэтому в контроллерах представления нет кода навигации.
Вы можете найти более подробную информацию в разделе «Размотка сегментов» . Как лучше объяснить в предыдущей ссылке, в том числе, как отправить данные обратно, но здесь я сделаю краткое объяснение.
1) Перейдите к контроллеру представления пункта назначения (не источника) и добавьте раскрутку:
@IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
//let sourceViewController = unwindSegue.source
// Use data from the view controller which initiated the unwind segue
}
2) Перетащите CTRL от самого контроллера представления к значку выхода в исходном контроллере представления:
3) Выберите функцию размотки, которую вы только что создали несколько минут назад:
4) Выберите "раскрутить" и дайте ему имя:
5) Пойдите в любое место контроллера представления источника и вызовите sewind:
performSegue(withIdentifier: "unwindToContact", sender: self)
Я обнаружил, что такой подход приносит много пользы, когда ваша навигация начинает усложняться.
Я надеюсь, что это поможет кому-то.