iOS 7.0 中从 viewController 返回后键盘不会关闭

问题描述 投票:0回答: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];

将通知删除到 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的通知方法中调用视图的方法。

问题:

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

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

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

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

我还实现了 UITextFieldDelegate 方法。

提前致谢

ios uiviewcontroller ios7 uitextfield keyboard-navigation
1个回答
1
投票

下面您可以看到保留的(弹出后不会释放)推送的 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}

  • [点击后退按钮]

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

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

  • 视图将出现:
  • 键盘将显示: 键盘框架 = {0, 306, 320, 262}

iPhone 5 的 iOS7 键盘生命周期

  • 视图将出现:
  • [您的文本字段成为第一响应者]
  • 键盘将显示: 键盘框架 = {0, 308, 320, 260}

  • [点击后退按钮]

  • 键盘将隐藏: 键盘框架 = {0, 568, 320, 260}
  • 键盘隐藏:
  • 键盘将显示: 键盘框架 = {0, 308, 320, 260}
  • 键盘将隐藏: 键盘框架 = {0, 320, 320, 260}
  • viewDidDisappear:

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

  • 视图将出现:
  • 键盘将显示: 键盘框架 = {0, 308, 320, 260}

不同的是,iOS7 正式尝试隐藏键盘弹出,但又显示键盘。

因此,如果您想在这两种情况下隐藏键盘,您需要在 viewWillDisappear 中显式退出 textField。请注意,textField.isFirstResponder等于viewWillDisappear中的NO 但是

[textField resignFirstResponder]; 

解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.