2011-12-04 30 views
15

我有一个模式表单(iPad)的表格视图,其中一个单元格包含一个UITextField。我的视图控制器持有对文本字段的引用,也是它的代表。UITextField的键盘不会消失。不,真的

当文本字段命中返回时,我将它告知-textFieldShouldReturn:内部的-resignFirstResponder。在另一种情况下,我想迫使它结束编辑,所以我把整个表格视为-endEditing:YES。之后,我将我的本地引用发布到文本字段,并重新加载行以将其替换为其他内容。

无论哪种情况,键盘都不会消失。我不知道什么是错,我不知道如何进一步调试。我从来没有遇到任何其他文本编辑过程中的粘性键盘问题 - 第一个响应者的辞职一直按预期行事。

有什么想法?谢谢。

+0

您的代码是否运行?你是否在正确的文本框上调用了resignFirstResponder? – Eiko

+0

是的。我确保在我称之为'-resignFirstResponder'的textField上'isFirstResponder'为YES。 –

回答

11

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

(参见Dismiss keyboard on IPAD

+0

哦,是的!终于为我解决了这个问题。记得在视图控制器中设置这个视图控制器,其中包含文本字段的视图控制器。 –

21

苹果文档describe this exception

在iPad,如果一个视图控制器模态使用 “形式片”的风格,键盘,显示一次呈现视图时,不隐藏,直到 用户抽头解除密钥或模态视图控制器以编程方式解除 。此行为的目的是为了避免用户在视图之间移动过多的动画,这些视图主要是 ,但不完全是文本字段。

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

+1

+1:我在拔出头发一小时后找到了这个答案,试图找出答案。答案是苹果是否做了这个愚蠢的实现ON PURPOSE?你一定是在开玩笑的苹果。 –

+9

您可以覆盖'disablesAutomaticKeyboardDismissal'方法并返回模式显示的视图控制器的NO。这将绕过防止键盘被解除的默认行为。 – gdavis

+1

不幸的是,disablesAutomaticKeyboardDismissal修复程序似乎已停止与iOS 6一起工作。其他人看到一样吗? – Snips

1

由于disablesAutomaticKeyboardDismissal倍率不iOS6的工作,我必须每个文本字段的“真的结束在退出”事件连接到一个方法,然后取消键盘那里,就像这样:

- (IBAction)doneEditing:(id)sender { 

[sender endEditing:YES]; 

}

0

disablesAutomaticKeyboardDismissal拒绝为我工作在iOS 7

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

我的解决方案描述为here

这甚至适用于Modal UIViewController s。

0

我刚刚发现这种情况发生的独特情况。我有一种观点,即解散时将键盘放在屏幕上。我检查了一切,我的UITextFields代表已连接到我的视图等。尝试在viewWillDisappear()中手动关闭键盘无效,无论是通过字段上的resignFirstResponder()还是视图上的endEditing()。

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

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

因此,当用户返回到以前的观点不输入任何文字,验证失败,该文本字段是不允许放弃它的第一个响应者的地位,以及键盘仍然在屏幕上,他们返回到前一个视图。

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

+1

或者只是'return self.validateField(textField)' – Alnitak

0

在迅速只是给你的UITextField的委托,并产生textFieldShouldReturn(),请参阅下面的例子 -

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

完成!