【问题标题】:UIKeyboardWillShowNotification - iOS8 vs iOS7UI KeyboardWillShowNotification - iOS 8 与 iOS 7
【发布时间】:2014-09-26 17:57:54
【问题描述】:

在 iOS8 中,我注意到视图控制器不再接收 UIKeyboardWillSHowNotification,而之前是在 iOS7 中。

这是场景:

1.) 视图控制器 A 正在显示一个键盘,并在不退出第一响应者的情况下推动视图控制器 B

2.) 视图控制器 B 有一个控件,该控件在其 viewDidLoad 调用期间成为第一响应者,同时它由 VCA 创建,然后被推送到导航控制器

3.) 如果 VC A 在按下 B 时没有显示键盘,则通知工作正常。但是,如果 A 在推 B 的时候还在编辑,那么 B 没有得到键盘就会显示通知。

如果没有键盘通知,VC B 不会调整大小/重新定位并且看起来不正确。


在找到解决方案之前,我正在使用的解决方法是在推送另一个可能正在编辑的视图控制器时从可能正在编辑的任何视图控制器执行以下操作:

即,在推送另一个视图控制器之前,请务必调用: [self.view endEditing:YES];

虽然它可以工作,但视图控制器 (B) 在显示之前可能被应用程序的状态“破坏”似乎并不好。


问题:我在这里做错了吗?

据我所知,三件事之一是可能的:

A.) 我应该收到通知,但我不是 b/c 我做错了什么

B.) 我应该收到通知,但我不是错误的 b/c

C.) 我不能依赖总是收到通知...但是如果在 VC B 中出现通知时我没有收到通知,我需要能够获得显示键盘的键盘尺寸,而无需依靠键盘通知信息。所有的苹果文档都说要使用通知(据我所知)....它指向选项 A.)或 B.)。


我可以在今晚晚些时候/明天早些时候创建和上传示例代码,以尝试隔离/供大家测试/重现以查看我在做什么。

【问题讨论】:

    标签: notifications keyboard ios8


    【解决方案1】:

    我可以在 iOS8 / xCode6 上看到同样的问题(适用于 iOS7 和 xCode5)。就我而言,我在 AppDelegate 中观察模型上的 systemStatus 属性,以便在用户从应用程序中的任何位置注销时将用户注销并返回登录屏幕。我通过在我的 App Delegate observeValueForKeyPath: 方法中将 window.rootViewController 设置为 loginViewController 来做到这一点。

    这在 iOS7 / xCode5 上运行良好,但在 iOS8 / xCode6 上,我松开了键盘。看起来我的 loginViewController 可能在窗口的 rootViewController 切换完成之前(在其 ViewWillAppear 方法中)注册键盘通知(在 iOS8 中),因此注册到旧窗口的通知中心......

    我将键盘通知的注册移到了 ViewDidAppear: 方法中,这似乎解决了它,但不知何故,这似乎被调用了两次。

    【讨论】: