UIKeyboardWillShowNotification调用两次ios 9

时间:2015-09-30 07:19:49

标签: ios objective-c iphone uitextfield ios9

我正在使用UIKeyboardWillShowNotification来检测用户何时选择文本字段并且键盘正在打开。在ios 8及更早版本的iOS中它工​​作正常但今天我升级到iOS 9和xCode 7.问题是在iOS中现在在选择每个文本字段后调用通知(而在ios 8中仅在选择第一个文本字段后调用)

我搜索了这个并找到了一些像Why is UIKeyboardWillShowNotification called every time another TextField is selected?

这样的帖子

但它不是关于iOS 9(实际上iOS8中的每一件事都是正确的,升级后我看到了问题)而且我也没有使用inputAccessoryViews。

3 个答案:

答案 0 :(得分:8)

这里的问题相同。我的视图控制器中有一些UITexfield,当我使用becomeFirstResponder方法以编程方式为另一个文本字段留下时,再次调用UIKeyboardWillShowNotification。即使键盘没有再次隐藏和显示。 但是,UIKeyboardWillHideNotification未被调用。

我不知道为什么这个问题出现在iOS9中,但我可以给你一个解决方法。我做了什么:我在视图控制器中创建了一个BOOL属性:

@property (assign, nonatomic) BOOL keyboardIsShown;

在我的键盘观察者方法中:

- (void)keyboardWillHideNotification:(NSNotification *)notification {

    self.keyboardIsShown = NO;   
    //rest of code
}


- (void)keyboardWillShowNotification:(NSNotification *)notification {

    if(self.keyboardIsShown) {
        return;
    }

    self.keyboardIsShown = YES;   
    //some code
}

如果有人有更清洁的解决方案,以避免在其他UIKeyboardWillShowNotification上调用becomeFirstResponder时在iOS9中多次调用UITextField,我会接受它!

答案 1 :(得分:2)

UITextField的inputAssistantItem属性导致UIKeyboardWillShowNotification被触发两次 - 一次是inputAssistantItem,另一次是实际键盘。

尝试将inputAssistantItem的leadingBarButtonGroups和trailingBarButtonGroups属性设置为空数组:

UITextInputAssistantItem* item = [textField inputAssistantItem];
item.leadingBarButtonGroups = @[];
item.trailingBarButtonGroups = @[];

此外,将UITextField的autocorrectionType设置为UITextAutocorrectionTypeNo(您也可以在XiB文件中更改此设置。)

textField.autocorrectionType = UITextAutocorrectionTypeNo;

您剩下的只是没有工具栏的软件键盘,UIKeyboardWillShowNotification只被调用一次。

答案 2 :(得分:1)

我认为由于键盘上方的建议列表,UIKeyboardWillShowNotification被触发了两次。 当我通过Settings-> General-> Keyboard-> Predictive关闭Predictive时,UIKeyboardWillShowNotification只触发一次。