Представление ландшафтного контроллера дает сбой SplitViewController - PullRequest
0 голосов
/ 07 февраля 2019

Некоторый фон:

В приложении есть TabBarController.TabBarController имеет VC1.1 и VC2.1.Приложение поддерживает только портрет для iPhone и для 1 экрана, который мы называем VC1.2 (о котором я расскажу позже), будет отображаться в альбомном режиме.Но для iPad мы поддерживаем как книжный, так и альбомный.

VC2.1 - это контроллер, у которого есть NavigationController.Этот экран 2.1 может выдвинуть новый экран 2.2.Важным примечанием является то, что на экранах 2.1 и 2.2 на iPad представлены вместе в разделенном виде.Но на iPhone мы представляем его только отдельно в 2.1 и 2.2.

Так как происходит сбой.

  1. Сбой воспроизводится только на iPhone + или X Max.
  2. Откройте VC2.1 и нажмите кнопку, чтобы нажать VC2.2.
  3. Вернитесь к VC1.1 и нажмите кнопку, чтобы отобразить экран VC1.2, который должен быть в альбомной ориентации.
  4. Приложениеаварийно завершает работу с этой информацией:

Предупреждение. Попытка представить, чье представление не входит в иерархию окон!

Несбалансированные вызовы для начала / окончания переходов появления для.

[Assert] Попытка закрыть контроллер презентации при переходе уже.(<_UIFullscreenPresentationController>)

[Assert] transitionViewForCurrentTransition не установлен, контроллер презентации был отклонен во время презентации?(<_UIFullscreenPresentationController) </p>

Так что получается, что на VC1.2 нам показывают экран, который мы заставляем находиться в ландшафтном режиме.И в VC2.2 (и в VC2.1), поскольку существует SplitView (хотя для iPhone он не используется), он каким-то образом пытается повернуть его и «показать» (или сделать вид, что показывает) это разделенное представление.И происходит сбой, потому что он не может этого сделать.

Итак, мы понимаем, почему это происходит, но не можем понять, есть ли способ это исправить или это проблема с iOS, может быть.

Если это помогает, в AppDelegate у нас есть этот метод:

private func defaultInterfaceOrientations(for window: UIWindow?) -> UIInterfaceOrientationMask {
    let isPhone: Bool

    if let window = window {
        isPhone = window.traitCollection.userInterfaceIdiom == .phone
    } else {
        isPhone = UIDevice.current.userInterfaceIdiom == .phone
    }

    return isPhone ? .portrait : .all
}

EDIT1 :

Существует одна очень интересная вещь, которая происходит в этом потоке и которая может датьдополнительная подсказка.

Шаги:

  1. Откройте VC2.1.Нажмите кнопку, чтобы нажать VC2.2.Нажмите кнопку возврата (всплывающее).
  2. Перейдите к VC1.1.Откройте ландшафтный экран V1.2.Это не потерпит крах.Это означает, что он падает только при открытии VC2.2, но при открытии VC2.1 - не происходит сбой.
  3. Интересный момент: когда вы открываете VC2 (элемент панели вкладок), вы ожидаете, что онбыть на VC2.1, так как мы вернулись (поп).Но почему-то это будет на экране VC2.2.Так что как-то в «спине» он сделал толчок VC2.2.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...