我有一个带有自定义视图类的 ViewController。 我通过添加到 viewWillAppear 方法并删除 viewDidDisappear 中的通知来处理键盘通知。
通知添加到viewWillAppear中:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector (keyboardWillShow:)
name: UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector (keyboardWillHide)
name: UIKeyboardWillHideNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector (keyboardDidHide)
name: UIKeyboardDidHideNotification object:nil];
将通知删除到 viewDidDisappear 中:
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object: nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object: nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object: nil];
并从viewController的通知方法中调用视图的方法。
问题:
如果我删除通知代码,那么效果就很好。
iOS 7.0之前,它与通知代码完美配合。但在 iOS 7.0 中,它不起作用。
我在每个通知方法中都打印了NSLog,在IOS 7.0中keyboardWillShow方法最后执行并再次出现键盘。但在iOS 6.0中,keyboardWillShow最终没有执行。
我还实现了 UITextFieldDelegate 方法。
提前致谢
下面您可以看到保留的(弹出后不会释放)推送的 viewController 与成为第一个响应者的 textField/textView 的键盘生命周期的差异。
让我们添加键盘观察者如下
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}
- (void) viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
}
iPhone 5 的 iOS6 键盘生命周期
键盘将显示: 键盘框架 = {0, 306, 320, 262}
[点击后退按钮]
viewDidDisappear:
[推送现有视图控制器]
iPhone 5 的 iOS7 键盘生命周期
键盘将显示: 键盘框架 = {0, 308, 320, 260}
[点击后退按钮]
viewDidDisappear:
[推送现有视图控制器]
不同的是,iOS7 正式尝试隐藏键盘弹出,但又显示键盘。
因此,如果您想在这两种情况下隐藏键盘,您需要在 viewWillDisappear 中显式退出 textField。请注意,textField.isFirstResponder等于viewWillDisappear中的NO 但是
[textField resignFirstResponder];
解决问题。