我有相当多的控件分散在我的表格中的许多表格单元格中,我想知道是否有一种更简单的方法来消除键盘,而不必循环遍历所有的控件并将它们全部辞职为第一响应器。我想问题是…我如何得到当前的第一个响应器的键盘?


当前回答

这不是很漂亮,但是当我不知道responder是什么时,我辞去firstResponder的方式:

创建一个UITextField,无论是在IB或编程。把它隐藏起来。如果你是用IB写的,就把它链接到你的代码上。 然后,当你想要解散键盘时,你将响应器切换到不可见的文本字段,并立即辞职:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

其他回答

这不是很漂亮,但是当我不知道responder是什么时,我辞去firstResponder的方式:

创建一个UITextField,无论是在IB或编程。把它隐藏起来。如果你是用IB写的,就把它链接到你的代码上。 然后,当你想要解散键盘时,你将响应器切换到不可见的文本字段,并立即辞职:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

您可以递归地遍历子视图,存储所有UITextFields的数组,然后循环遍历它们并重新分配它们。

这并不是一个很好的解决方案,特别是当你有很多子视图时,但对于简单的应用程序来说,它应该是可行的。

我用一种更复杂,但更高效的方式解决了这个问题,但使用了我的应用程序的动画引擎的单例/管理器,任何时候一个文本字段成为响应器,我会将它分配给一个静态,它会根据某些其他事件被清除(辞职)…我几乎不可能用一段话解释清楚。

要有创意,在我发现这个问题后,我只花了10分钟就考虑了这个问题。

要在键盘弹出后关闭键盘,有两种情况,

当UITextField在UIScrollView中 当UITextField在UIScrollView之外时

2.当UITextField在UIScrollView之外时 重写UIViewController子类中的方法

你还必须为所有UITextView添加委托

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}

在滚动视图中,点击外部不会触发任何事件,所以在这种情况下使用点击手势识别器, 拖拽滚动视图的UITapGesture并为其创建IBAction。

要创建一个IBAction,按ctrl+单击UITapGesture并将其拖到视图控制器的.h文件中。

这里我将tappedEvent命名为我的动作名

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

以上所提供的信息来自以下链接,如果您不理解以上数据,请参阅更多信息或与我联系。

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

从UITableView和UIScrollView中取消键盘的最好方法是:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

比Meagar的回答更简单

覆盖touchesBegan: withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}

当你在背景中触摸任何地方时,这将使键盘消失。