如何在iPhone上触碰空白区域时隐藏键盘

71

通常当您触摸文本输入区域时,键盘会弹出;当您触摸屏幕的空白区域时,键盘会消失。如何实现这一效果?

就像我们在 iPhone Safari 上所体验到的那样...

谢谢

11个回答

114

更新的方式(推荐):

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

这将结束所有子视图的编辑并放弃第一响应者。

另一种方法(枚举所有文本视图):

以下是一步一步的说明:

在您的视图控制器中添加一个IBAction,例如 -(IBAction)backgroundTouch:(id)sender

在backgroundTouch操作中,您需要向视图中的所有文本框发送resignFirstResponder消息。这很不幸但必要,因为目前没有办法检索当前具有FirstResponder状态的对象。它应该类似于这样:

- (IBAction)backgroundTouch:(id)sender {
  [someTextBox resignFirstResponder];
  [anotherTextBox resignFirstResponder];
}

在视图中添加一个按钮控件,将其大小设置为覆盖整个可见区域(除了状态栏、任何选项卡或导航控制器)。选择按钮,然后转到布局菜单并选择“发送到背面”。还要将按钮的类型设置为custom,如果您没有提供任何绘图代码,它将是不可见的。

将按钮的“Touch Up Inside”事件连接到“backgroundTouch:”操作上,并尝试一下。


51
在另一篇帖子中发现了一个捷径:[self.view endEditing:YES]; 将结束所有子视图中的编辑并放弃第一响应者。 这比枚举所有文本框要清晰得多,而且当您后来添加字段时也不会出问题! - Peter DeWeese
感谢HitScan的详细解释,也非常感谢Peter与我们分享这个快捷方式! - necixy
在第一个解决方案中,touchesBegan:withEvent: 不应该调用 [super touchesBegan:touches withEvent:event] 吗? - Gonzo

73

可以使用这个简单的解决方案

对于 Swift 4:

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
   }

对于 Swift 2:

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }

针对 Objective-C:

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

适用于UITextField、UITextView和所有子视图。


1
简单而优美的解决方案。像魔法一样运作! - Mahendra Liya
我该怎么使用它?我有一个ViewController,但它从未被调用过。所以我必须子类化UIView并覆盖此方法,然后在IB中将我的视图设置为此子类吗? - Sandy
@Rob 只需将您的代码添加到 viewcontroller.m 中,无需与视图链接。它应该可以工作。 - Shahid Aslam
1
在整个网络上,这是唯一没有错误的解决方案(大多数其他解决方案会导致按钮与其选择器发生冲突),并且在所有解决方案中最为优雅,我向您致敬。 - SAFAD

16

不用在背景中放置按钮,这里有一个简单的解决方案

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.textfieldName resignFirstResponder];
}

这是一个比该问题的顶部答案更为简洁的解决方案! - Aftermathew
如果textField在tableViewCell中,我该如何使其工作? - xueru

4

对于iOS 4.0及以上版本,有另一种解决方案(也许更好)。使用此代码,在视图中单击任意位置即可隐藏键盘。

// single tap to resign keyboard
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithBlock:^(UIGestureRecognizer *rec){
            [input_text resignFirstResponder];
        }];
self.singleTapRecognizer.numberOfTapsRequired = 1;
self.singleTapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:singleTapRecognizer];

4

这个问题有一个关于它的教程(也涉及没有DONE键的数字键盘),在这里


2
resignFirstResponder 发送给控件。

1
你也可以这样做
通过触摸视图中的背景来隐藏键盘
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}

1
以下代码在 Xamarin iOS 项目中正常运行:
public override void TouchesBegan (NSSet touches, UIEvent evt){
    View.EndEditing (true);
}

0

如果你正在使用Swift和iOS 8/9,这个解决方案应该可以很好地工作:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
         self.view.endEditing(true)
    }

0

我无法使用“initWithBlock:”选择器编译Val上面的答案。

这段代码对我有效。将其添加到定义视图的方法中 - 请注意,我的视图是组合的,我想要响应单击的子视图是“chatView”。使用键盘的输入字段视图名为“chatInput”。

    // single tap to resign (hide) the keyboard
    UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
    singleTapRecognizer.numberOfTouchesRequired = 1;
    singleTapRecognizer.cancelsTouchesInView = NO;
    [chatContent addGestureRecognizer:singleTapRecognizer];

然后添加点击处理方法。

/**
 * Handles a recognized single tap gesture.
 */
- (void) handleTapFrom: (UITapGestureRecognizer *) recognizer {
    // hide the keyboard
    NSLog(@"hiding the keyboard");
    [chatInput resignFirstResponder]; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接