小编jsb*_*lau的帖子

UISplitViewController 在 iOS 11.2 上启动时加载视图之前调用 viewWillDisappear(_:)

我有一个以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(_:) 。 …

uisplitviewcontroller viewwilldisappear ios11.2

5
推荐指数
0
解决办法
368
查看次数