16

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

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

无论哪种情况,键盘都不会消失。我不知道出了什么问题,我不确定如何进一步调试。在我完成的任何其他文本编辑中,我从来没有遇到过粘滞键盘问题——firstResponder 辞职总是表现得如预期的那样。

有什么想法吗?谢谢。

4

6 回答 6

21

Apple 文档描述了这个异常

在 iPad 上,如果视图控制器使用“表单”样式以模态方式呈现其视图,则键盘一旦显示,在用户点击关闭键或模态视图控制器以编程方式关闭之前不会隐藏。此行为的目的是避免在用户在主要但不完全是文本字段的视图之间移动时出现过多的动画。

这恰好适用于此处(iPad 上的模态表单)。在这种情况下,显然不可能关闭键盘。极好的。:\

于 2011-12-04T23:41:43.900 回答
11

实施-disablesAutomaticKeyboardDismissal并返回 NO。它确实适用于 iOS 6,但您必须在正确的控制器中实现它。如果您有一个模态表单导航控制器,其子控制器具有文本字段,则需要方法实现的是导航控制器,而不是子控制器。

(另见关闭 IPAD 上的键盘

于 2013-04-11T18:15:31.587 回答
1

由于 disablesAutomaticKeyboardDismissal 覆盖在 iOS6 上不起作用,我必须将每个文本字段的“退出时结束”事件连接到一个方法,然后在那里关闭键盘,如下所示:

- (IBAction)doneEditing:(id)sender {

[sender endEditing:YES];

}

于 2012-10-18T20:08:40.030 回答
0

disablesAutomaticKeyboardDismissal拒绝在 iOS 7 上为我工作。

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

我的解决方案在这里描述。

这甚至适用于 Modal UIViewControllers。

于 2014-04-22T13:42:48.973 回答
0

我刚刚发现发生这种情况的独特情况。我有一个观点,当被解雇时,键盘会留在屏幕上。我检查了所有内容,我的 UITextFields 代表已连接到我的视图等。尝试在 viewWillDisappear() 中手动关闭键盘是行不通的,无论是通过字段上的 resignFirstResponder() 还是视图上的 endEditing()。

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

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

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

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

于 2016-05-06T23:39:20.703 回答
0

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

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

完毕!

于 2017-12-26T05:54:44.720 回答