【问题标题】:UIKeyboardWillShowNotification calling twice ios 9UIKeyboardWillShowNotification 调用两次 ios 9
【发布时间】:2015-09-30 07:19:48
【问题描述】:

我正在使用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。

【问题讨论】:

    标签: ios objective-c iphone uitextfield ios9


    【解决方案1】:

    同样的问题。我的视图控制器中有一些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
    }
    

    如果有人有更简洁的解决方案来避免在 iOS9 中在另一个 UITextField 上调用 becomeFirstResponder 时多次调用 UIKeyboardWillShowNotification,我会接受!

    【讨论】:

    • 我刚刚看到你的解决方案。我也使用它,但这个解决方案也有另一个问题。当您在这段时间内反复点击文本字段(尝试快速点击文本字段)时,观察者会快速调用,并且他们的keyboardIsShown标志都是NO。我认为这是因为它们不同步。你也有解决办法吗?
    • 你看到我的评论了吗?
    • 我没有你描述的问题:在文本字段中快速重复点击不会为我触发 UIKeyboardWillShowNotification。
    • 这是他的问题,他使用的是文本字段中的 texthaschanged 而不是 UIKeyboardWillShowNotification 。我认为这可能是他的问题!
    【解决方案2】:

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

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

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

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

    textField.autocorrectionType = UITextAutocorrectionTypeNo;
    

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

    【讨论】:

    • 我认为这个答案是正确的。但根据我的经验,它实际上是设置一个inputAccessoryView 触发UIKeyboardWillShowNotification 两次。不幸的是,如果你想拥有它,不设置一个不是一种选择。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      相关资源
      最近更新 更多