我有一个以UISplitViewController作为初始控制器的应用程序,它有一个主视图控制器和一个详细视图控制器(嵌入在 UINavigationControllers 中)作为其子视图控制器,在 Interface Builder 中布局。分割视图控制器的PreferredDisplayMode设置为.primaryHidden。
我刚刚升级到 Xcode 9.2,它在模拟器中使用 iOS 11.2。当我在 iPhone(设备或模拟器)上启动应用程序时,我在启动时看到一个新行为:在详细视图控制器上的viewDidLoad()之前调用 viewWillDisappear (_:) 。此时,详细视图控制器尚未加载 - 它的所有 IBOutlet 均为 nil。调用之后,系统会像往常一样加载视图并调用viewDidLoad()。
我发现这一点是因为viewWillDisappear(_:)方法访问了 UITextField 以检查它是否是第一响应者。在下面的代码中,文本字段通过 IBOutlet 连接到 UITextField:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if textfield.isFirstResponder {
textfield.resignFirstResponder()
}
}
Run Code Online (Sandbox Code Playgroud)
由于视图尚未加载,文本字段为零,应用程序崩溃了。通过添加 nil 测试很容易解决这个问题。但在 Xcode 和 iOS 的早期版本中,崩溃并没有发生,因为我认为在加载视图之前没有调用viewWillDisappear(_:) 。
另外有趣的是,在 iPad(设备或模拟器)上运行 iOS 11.2 的 Xcode 9.2 不会发生这种情况。在 iPad 上,在详细视图控制器上启动时不会调用viewWillDisappear(_:) 。
这看起来像是一个错误:为什么应该在视图在启动时实际加载之前在详细视图控制器(或任何视图控制器)上调用viewWillDisappear(_:) 。 …