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