#ios #swift #uinavigationbar #uisplitviewcontroller
#iOS #swift #Панель навигации uinavigationbar #uisplitviewcontroller
Вопрос:
Для моего приложения я создал разделенное представление, встроенное в представление контейнера, т. Е. Разделенное представление не находится в корне приложения.
Как видно на изображении, я добавил элемент навигации в главное представление, который служит кнопкой возврата и выводит весь разделенный вид из основного стека навигации.
@IBAction func backButtonTapped(_ sender: UIBarButtonItem) {
parent?.navigationController?.popViewController(animated: true)
}
Это хорошо работает на всех устройствах, когда я устанавливаю режим отображения в режиме разделения allVisible
. Это работает как для свернутого вида (например, в портретном режиме iPhone), так и для расширенного разделенного вида.
Проблема: когда я использую другой режим отображения, такой как Auto
или primaryHidden
кнопка навигации в главном представлении по-прежнему отображается, но не работает в альбомном (расширенном) виде. Вызывается обработчик кнопок, но приведенная выше инструкция не выводит из режима разделения. Похоже, что родительский навигационный контроллер недоступен таким образом (= nil). Почему оператор не работает в некоторых режимах отображения и как я могу заставить его работать?
Ответ №1:
Это кажется немного неуклюжим, но оно выполняет свою работу. Лучшее решение может быть получено из понимания того, почему родительский навигационный контроллер доступен в некоторых режимах отображения, но не в других.
Что действительно работает, так это переход через навигационный контроллер подробного представления и удаление его из стека. Режим отображения здесь изменен, чтобы предотвратить некоторый уродливый эффект перехода.
@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)
}
}