UITextField的键盘不会被忽略。不完全是

时间:2011-12-04 22:47:11

标签: ios ipad uitableview uitextfield resignfirstresponder

我在模态表格(iPad)中有一个表格视图,其中一个单元格包含一个UITextField。我的视图控制器保存对文本字段的引用,也是其委托。

当文本字段点击Return时,我会将其告诉-resignFirstResponder内的-textFieldShouldReturn:。在另一种情况下,我想强制它结束编辑,所以我将整个表视图告诉-endEditing:YES。然后我释放我对文本字段的本地引用,并重新加载该行以用其他东西替换它。

在任何一种情况下,键盘都不会消失。我不知道出了什么问题,我不确定如何进一步调试。我从来没有遇到任何其他文本编辑的粘性键盘问题 - 第一个响应者辞职总是按预期进行。

有什么想法?感谢。

6 个答案:

答案 0 :(得分:21)

Apple文档describe this exception

  

在iPad上,如果视图控制器使用模态显示其视图   “表单”样式,键盘一旦显示,直到被隐藏   用户点击关闭键或模态视图控制器   以编程方式解雇。这种行为的目的是避免   当用户在视图之间移动时,动画过多,   但不完全是文本字段。

这适用于此处(iPad上的模态表单)。在这种情况下,显然不可能解雇键盘。超。 :\

答案 1 :(得分:11)

实施-disablesAutomaticKeyboardDismissal并返回NO。 可以在iOS 6上运行,但您必须在正确的控制器中实现它。如果你有一个带有文本字段的子控制器的模态表单导航控制器,那么导航控制器需要方法实现,而不是子项。

(另见Dismiss keyboard on IPAD

答案 2 :(得分:1)

由于disablesAutomaticKeyboardDismissal覆盖在iOS6上不起作用,我必须将每个文本字段的“Do End On Exit”事件连接到方法,然后在那里解除键盘,如下所示:

- (IBAction)doneEditing:(id)sender {

[sender endEditing:YES];

}

答案 3 :(得分:0)

{7}在iOS 7上拒绝为我工作。

但是......我设法通过禁用屏幕上的UITextFields来解决这个问题。

我的解决方案描述为here

这甚至适用于Modal disablesAutomaticKeyboardDismissal s。

答案 4 :(得分:0)

我刚刚发现了这种情况发生的独特情况。我认为当被解雇时将键盘留在屏幕上。我检查了所有内容,我的UITextFields代表已连接到我的视图等。试图在viewWillDisappear()中手动关闭键盘无法通过字段上的resignFirstResponder()或视图上的endEditing()进行操作。

然后我意识到这是委托方法本身的字段验证代码。每次编辑在字段中结束时,我都会在textFieldShouldEndEditing委托方法中验证文本,以确保文本是合理的,就像这样,并且在验证之前不允许它们跳出字段。

  func textFieldShouldEndEditing(textField: UITextField) -> Bool
    {
        if self.validateField(textField) {
           return true
        } else {
          return false
        }
   }

因此,当用户在没有输入任何文本的情况下返回上一个视图时,验证失败,不允许文本字段放弃它的第一个响应者状态,并且键盘在返回到上一个视图时仍保留在屏幕上。

这是一种不寻常的情况,但希望这会帮助遇到它的其他人。

答案 5 :(得分:0)

在swift中,只需给你的UITextField一个委托并生成textFieldShouldReturn(),见下面的例子 -

class ViewController: UIViewController, UITextFieldDelegate {
    func settingUpTextField() {
        textField.delegate = self;
        return;
    }
    ...
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder();
        return true;
    }
}

完成!