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


71

通常,当您触摸文本输入区域时,键盘会弹出,而当您触摸屏幕的空白区域时,键盘会消失。如何做到这一点?

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

谢谢

Answers:


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];
}

在视图中添加一个按钮控件,调整其大小以覆盖整个可见区域(状态栏或任何选项卡或导航控制器除外)。选择按钮,然后转到布局菜单,然后选择发送回。还将按钮的“类型”设置为“自定义”,如果您没有专门为其提供任何绘图代码,则该按钮将不可见。

将Button的“ Touch Up Inside”事件连接到backgroundTouch:操作,然后尝试一下。


51
在另一篇文章中找到了捷径:[self.view endEditing:YES]; 将结束所有子视图中的编辑并退出第一响应者。它比枚举所有文本框更加清晰,以后添加字段时不会中断!
Peter DeWeese 2010年

感谢HitScan的详细说明,也非常感谢Peter与我们分享捷径!!
necixy 2011年

在第一个解决方案上,touchesBegan:withEvent:不应该打电话[super touchesBegan:touches withEvent:event]吗?
奇闻趣事

72

使用这个简单的解决方案

对于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)
    }

对于目标C:

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

与UITextField,UITextView和所有子视图一起使用。


1
简单优雅的解决方案。
Mahendra Liya

我该如何使用?我有一个ViewController,但从未调用过。那么,我是否必须继承UIView并重写此方法,然后在IB中对该子类进行查看?
桑迪,

@Rob只需将代码添加到viewcontroller.m中,无需链接到视图。它应该起作用
沙希德·阿斯兰

1
在网络上,这是唯一的无错误解决方案(大多数其他解决方案导致按钮未调用选择器而发生冲突),并且它们之间的配合最为优雅,我向您致敬
SAFAD 2014年

16

忘记在后台放置按钮的简单解决方案

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

这是比此问题的最佳答案更干净的解决方案!
Aftermathew

这次真是万分感谢!奇迹般有效!
emilyk'4

如果文本字段在tableViewCell中,该如何工作?
xueru 2014年

4

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


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];


1

以下代码与xamarin iOS项目配合使用:

public override void TouchesBegan (NSSet touches, UIEvent evt){
    View.EndEditing (true);
}

1

你也可以这样

通过触摸背景隐藏键盘

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

0

我也有这个问题,这很烦人。但是我想出了如何在意外的情况下摆脱键盘。假设您正在向John发短信,并且您在观看对话时有一个键盘,因此会缩小屏幕的显示范围。好吧,然后单击左上方的消息,然后选择一个与您有短信记录的人,然后再次单击左上方的消息。然后返回并选择John。不,您回到了与John的对话,键盘消失了。接缝很像,但是很快。您可能以为他们只是在键盘上放了一个隐藏按钮,大声笑希望能帮上忙,或者说得足够清楚。


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]; 
}

0

如果您使用Swift和iOS 8/9,则此解决方案应该可以正常工作:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
         self.view.endEditing(true)
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.