我正在使用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。
答案 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只触发一次。