呈现景观控制器崩溃SplitViewController

时间:2019-02-07 12:11:51

标签: ios objective-c swift uisplitviewcontroller

某些背景

该应用程序具有一个TabBarController。 TabBarController具有VC1.1和VC2.1。 该应用程序仅支持iPhone的人像和1个我们称为VC1.2的屏幕(我将在后面提到),它将以横向模式显示。 但是对于iPad,我们同时支持纵向和横向。

VC2.1是具有NavigationController的控制器。此屏幕2.1可以推送新屏幕2.2。重要说明是iPad上的屏幕2.1和2.2在拆分视图中一起显示。但是在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)

所以发生的是在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。

0 个答案:

没有答案