如果用户点击屏幕键盘,我该如何关闭键盘?

She*_*lam 42 iphone cocoa-touch objective-c uitextfield ios

我希望能够在用户点击键盘外的任何位置时关闭iPhone键盘.我该怎么做呢?我知道我需要解雇响应者,但需要知道当用户从键盘空间中弹出时如何实现它.

vis*_*kh7 82

您需要添加一个UITapGestureRecogniser并将其分配给视图,然后在其选择器的文本字段上调用resign first responder.

代码:

viewDidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];
Run Code Online (Sandbox Code Playgroud)

dismissKeyboard:

-(void)dismissKeyboard {
       [aTextField resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

(其中aTextField是负责键盘的文本字段)

方案2

如果您无法承担添加gestureRecognizer的费用,那么您可以试试这个

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [aTextField resignFirstResponder];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这很棒,但是,手势动作正在吃掉我在视图上的所有按钮点击事件.有任何想法吗? (4认同)
  • 我认为这很棒,但它也覆盖了像CollectionViews这样的任何其他输入.请参阅下面的Matt Rees评论以获得修复. (3认同)

小智 42

我用过的最简单的解决方案是:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

      [self.view endEditing:YES];

}
Run Code Online (Sandbox Code Playgroud)

endEditing命令可用于包含文本字段作为子视图的任何视图.此方法的另一个优点是您不需要知道哪个文本字段触发了键盘.因此,即使您有多个文本字段,只需将此行添加到superview即可.

基于Apple文档,我认为这种方法专门用于解决这个问题.


Mat*_*ees 16

添加tapGesture识别器但请确保cancelsTouchesInView = NO

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
Run Code Online (Sandbox Code Playgroud)