4

我有一个以UISplitViewController作为初始控制器的应用程序,它有一个主视图控制器和一个详细视图控制器(嵌入在 UINavigationControllers 中)作为其子视图控制器,在 Interface Builder 中布局。拆分视图控制器的preferredDisplayMode设置为.primaryHidden

我刚刚升级到 Xcode 9.2,它在模拟器中使用 iOS 11.2。当我在 iPhone(设备或模拟器)上启动应用程序时,我在启动时看到了一个新行为:在详细视图控制器上的viewDidLoad()之前调用了viewWillDisappear(_:) 。此时细节视图控制器还没有加载——它的所有 IBOutlets 都是 nil。在该调用之后,系统加载视图并照常调用viewDidLoad() 。

我发现这一点是因为viewWillDisappear(_:)方法访问了 UITextField 以检查它是否是第一响应者。在下面的代码中,文本字段通过 IBOutlet 连接到 UITextField:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if textfield.isFirstResponder {
        textfield.resignFirstResponder()
    }
}

由于尚未加载视图,因此textfield为 nil 并且应用程序崩溃了。这很容易通过添加 nil 测试来解决。但是在早期版本的 Xcode 和 iOS 中,没有发生崩溃,因为我认为viewWillDisappear(_:)在加载视图之前没有被调用。

同样有趣的是,在 iPad(设备或模拟器)上运行 iOS 11.2 的 Xcode 9.2 不会发生这种情况。在 iPad 上,viewWillDisappear(_:)不会在详细视图控制器上启动时调用。

这似乎是一个错误:为什么要在启动时实际加载视图之前在详细视图控制器(或任何视图控制器)上调用viewWillDisappear(_:) 。是否有其他人在运行 iOS 11.2 的 iPhone 上使用 UISplitViewController 看到这种行为?还是我忽略了某些事情的结果,即使该应用程序在早期版本中没有问题?

4

0 回答 0