在 iOS 7 中苹果做了许多改变,其中值得注意的一个问题就是键盘。
有许多在 iOS 6 中运行正常的 app,在 iOS 7 中却出现了键盘无法消失的问题。
例如 iPad 键盘中有一个“释放键盘”按钮,点击它能够使键盘收起。这在大多数 iOS 6 app 中是有效的,但在 iOS 7 下运行这些程序时,你会发现点击“释放键盘”按钮键盘不会消失,甚至当用户通过导航按钮切换到其他窗口,这个键盘也不会消失!
更为严重的是,在这种情况下,所有输入控件都无法获得焦点,你不能进行任何输入!
这种情况多半是由于代码中没有正确的 resignFirstResponder 所导致的。
在 iOS 6 中,输入控件有没有 resignFirstResponder 并不重要,当会话结束,键盘会自动消失。
但在 iOS 7 中,isFirstResponder 的控件似乎是一直存在的,如果你不小心(或者恶意的)在控件里面构成了一个 becomeFirstResponder 的循环,则别的控件就别想获得焦点。哪怕这个控件的 superView 被释放,这个 firstResponder 也会顽固地存在,一直到你关闭应用程序。也就说视图被销毁,firstResponder 仍然不会被销毁。当你在次打开同一视图,这个控件重建,但已经是另一个实例了,原来的那个实例(firstResponder)仍然存在,并且它会一直占有 firstResponder,导致任何输入组件都无法输入。
我们可以制作这样一种恶意的 textField,当它 endEditing 的时候,让它再次 becomeFirstResponder,于是它会一直占有 firstResponder ,其它控件永远别想获得焦点……