Обратная навигация Master View в режиме разделения не работает с режимами отображения «Auto» или «primaryHidden»

#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)
    }
}