Для своего приложения я создал разделенное представление, встроенное в представление контейнера, то есть разделенное представление не находится в корне приложения.
Как видно на изображении, я добавил элемент навигации в основной вид, который служит кнопкой «Назад» и выталкивает весь разделенный вид из основного стека навигации.
@IBAction func backButtonTapped(_ sender: UIBarButtonItem) {
parent?.navigationController?.popViewController(animated: true)
}
Это хорошо работает на всех устройствах, когда я установил режим отображения разделенного экрана на allVisible
. Он работает как для свернутого вида (например, в портретном режиме iPhone), так и для расширенного разделенного вида.
Проблема: Когда я использую другой режим отображения, например Auto
или primaryHidden
, кнопка навигации в основном виде по-прежнему отображается, но не работает в ландшафтном (расширенном) виде. Обработчик кнопки вызывается, но приведенный выше оператор не выходит из разделенного представления. Кажется, что родительский навигационный контроллер недоступен таким образом (= nil). Почему инструкция не работает в некоторых режимах отображения и как заставить ее работать?
Это кажется немного неуклюжим, но это делает работу. Лучшее решение может прийти из понимания того, почему родительский навигационный контроллер доступен в некоторых режимах отображения, но не доступен в других.
Что действительно работает, так это переход через навигационный контроллер подробного представления и удаление его из стека. Режим отображения изменен здесь, чтобы предотвратить некрасивый эффект перехода.
@IBAction func backButtonTapped(_ sender: UIBarButtonItem) {
if (splitViewController!.viewControllers.count > 1) {
// master and detail visible in split view
let detailViewController = splitViewController!.viewControllers[1]
splitViewController!.preferredDisplayMode = .primaryHidden
detailViewController.navigationController?.popViewController(animated: true)
} else {
// split view collapsed into single view mode (e.g. iPhone portrait)
parent?.navigationController?.popViewController(animated: true)
}
}