1

我有一个带有自定义视图类的 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];

将 Notification 移除到 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 的通知方法中调用 view 的方法。

问题:

  • 点击 UITextField 后,键盘出现并正确完成动画
  • 但是在键盘出现后,如果用户从导航栏中按下后退按钮,那么在 ViewController 从屏幕上消失后,键盘将不会被移除。
  • 现在用户无法关闭键盘

如果我删除通知代码,那么效果很好。

在 iOS 7.0 之前,它可以完美地与通知代码配合使用。但在 iOS 7.0 中,它不起作用。

我在每个通知方法中都打印了 NSLog,在 IOS 7.0 中,keyboardWillShow 方法最后执行并再次出现键盘。但是在 iOS 6.0 中,keyboardWillShow 最终没有执行。

我还实现了 UITextFieldDelegate 方法。

提前致谢

4

1 回答 1

1

下面你可以看到保留(弹出后不会解除分配)推送的 viewController 与 textField/textView 的键盘生命周期的差异,它成为 firstResponder。

让我们添加键盘观察者如下

- (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 键盘生命周期

  • 视图将出现:
  • [YourTextField 成为FirstResponder]
  • keyboardWillShow:keyboardFrame = {0, 306, 320, 262}

  • [点击返回按钮]

  • 键盘将隐藏:keyboardFrame = {320, 306, 320, 262}
  • viewDidDisappear:

  • [推送现有视图控制器]

  • 视图将出现:
  • keyboardWillShow:keyboardFrame = {0, 306, 320, 262}

iPhone 5 的 iOS7 键盘生命周期

  • 视图将出现:
  • [YourTextField 成为FirstResponder]
  • keyboardWillShow:keyboardFrame = {0, 308, 320, 260}

  • [点击返回按钮]

  • 键盘将隐藏:keyboardFrame = {0, 568, 320, 260}
  • 键盘隐藏:
  • keyboardWillShow:keyboardFrame = {0, 308, 320, 260}
  • keyboardWillHide:keyboardFrame = {0, 320, 320, 260}
  • viewDidDisappear:

  • [推送现有视图控制器]

  • 视图将出现:
  • keyboardWillShow:keyboardFrame = {0, 308, 320, 260}

不同之处在于 iOS7 正式尝试隐藏键盘弹出但又显示键盘。

因此,如果您想在这两种情况下都隐藏键盘,则需要在viewWillDisappear中明确退出 textField 。请注意textField.isFirstRespondervi​​ewWillDisappear中等于NO

[textField resignFirstResponder]; 

解决问题。

于 2013-12-18T13:37:27.813 回答