71

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

就像我们在 iphone safari 上所经历的一样......

谢谢

4

11 回答 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];
}

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

将 Button 的 Touch Up Inside 事件连接到 backgroundTouch: 动作并尝试一下。

于 2009-04-30T02:35:18.500 回答
72

使用这个简单的解决方案

对于斯威夫特 4:

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

对于斯威夫特 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 和所有子视图。

于 2012-03-08T14:10:20.540 回答
16

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

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.textfieldName resignFirstResponder];
}
于 2011-11-19T17:39:46.733 回答
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];
于 2011-12-27T15:38:51.607 回答
4

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

于 2009-07-29T11:05:30.930 回答
2

发送resignFirstResponder到控件。

于 2009-04-29T23:44:11.330 回答
1

以下代码适用于 xamarin iOS 项目:

public override void TouchesBegan (NSSet touches, UIEvent evt){
    View.EndEditing (true);
}
于 2015-02-02T11:40:07.197 回答
1

你也可以这样做

通过在视图中触摸背景来隐藏键盘

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
于 2014-08-05T08:03:19.067 回答
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]; 
}
于 2012-07-12T02:51:23.650 回答
0

我也遇到了这个问题,很烦。但我想出了如何在意外中摆脱键盘。假设您正在给 John 发短信,并且有一个键盘妨碍您查看对话,因此减少了您可以看到的屏幕。然后点击左上角的消息,然后选择另一个你有发短信记录的人,然后再次点击左上角的消息。然后返回并选择 John。不,你又回到了与约翰的对话中,键盘不见了。接缝很多,但速度很快。你会认为他们只是在键盘上放了一个隐藏按钮 lol 希望有帮助,或者足够清楚。

于 2011-07-26T23:13:27.737 回答
0

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

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
         self.view.endEditing(true)
    }
于 2015-06-12T21:35:00.423 回答