首页 > 解决方案 > 呈现景观控制器崩溃 SplitViewController

问题描述

一些背景:

该应用程序有一个 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
}

编辑1

在这个流程中发生了一件非常有趣的事情,它可能会提供额外的提示。

脚步:

  1. 打开VC2.1。按下按钮推动VC2.2。按返回按钮(弹出)。
  2. 转至 VC1.1。打开横屏V1.2。它不会崩溃。这意味着它仅在打开 VC2.2 时崩溃,但在打开 VC2.1 时 - 它不会崩溃。
  3. 有趣的一点:当您打开 VC2(标签栏项目)时,您会期望它在 VC2.1 上,因为我们返回(弹出)。但由于某种原因,它将出现在 VC2.2 屏幕上。所以不知何故在“后面”它推动了VC2.2。

标签: iosobjective-cswiftuisplitviewcontroller

解决方案


推荐阅读