用户触摸uiview时隐藏键盘

时间:2009-06-08 05:54:11

标签: iphone

我有一个带有多个文本框的UIView。现在我已经使用委托将响应者从文本字段更改为另一个。在这种情况下,当用户到达最后一个文本字段时,我的键盘会消失。

但现在我想在用户触摸UIView时隐藏我的键盘(除了文本框之外触摸屏幕上的任何位置)。有人可以帮我解决这个问题。

由于

11 个答案:

答案 0 :(得分:43)

在touchesBegan中使用resignFirstResponder,如下所示:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [self.myTextField resignFirstResponder];
    }
}

如果您不确定焦点当前位于何处,您可能需要在多个文本字段上调用此字段;我没有测试那个案例。

此外,在Interface Builder中,您需要为视图启用“启用用户交互”复选框,或以编程方式使用:

myView.userInteractionEnabled = YES;

答案 1 :(得分:25)

当您想要隐藏键盘时,只需在视图控制器中调用它。

[self.view endEditing:NO];

答案 2 :(得分:14)

我用

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     UITouch *touch = [touches anyObject];
     if(touch.phase==UITouchPhaseBegan){
         //find first response view
         for (UIView *view in [self.view subviews]) {
             if ([view isFirstResponder]) {
                 [view resignFirstResponder];
                 break;
             }
         }
     }
}

答案 3 :(得分:3)

根据Beginning iPhone Development,您绘制一个圆形的矩形按钮,以便它覆盖整个UI;完整的屏幕。然后转到布局菜单,然后点击发送到后面。然后在检查器中,将按钮的类型从圆形矩形更改为自定义。现在在此按钮中添加一个内部触摸事件,并将其附加到处理它的方法。在此方法的主体内,请确保您具有以下语句:

[myTextFieldOne resignFirstResponder];
[myTextFieldTwo resignFirstResponder];

基本上将resignFirstResponder消息发送到您的每个文本字段或任何可以生成键盘的字段。

我其实是iPhone SDK的新手。我不知道这是否是最好的方法,但它有效,这是我从上述书中学到的。希望它有所帮助。

答案 4 :(得分:3)

这是一个非常简单的方法,就是PCheese所说的。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
    [self.view endEditing:YES];
}

}

我以前使用[self.view endEditing:YES];来表示按钮事件,但是当与之前的回答结合使用时,它会有效。更简单,你不必做任何其他事情 - 只需将它放在你的.m文件中。此外,这适用于所有(至少,据我所见)文本字段(适用于UITextField和UITextView)。

我知道OP可能不会仍然需要这个,但我只是想为有同样问题的其他人分享它。

答案 5 :(得分:2)

谢谢Blaenk,我试图弄清楚如何做到这一点,并没有意识到我可以在背景中放一个按钮,好戏!这是我的贡献(这个网站和Cocoa Touch的新功能所以它可能不是有史以来最强大的代码,但它到目前为止工作......):

我从我的UIButton上的touchUpInside事件中调用此方法:

-(void)closeKeyboard:(id)sender {
    UIView *theFirstResponder = [self findFirstResponder];
    if (theFirstResponder) {
        [theFirstResponder resignFirstResponder];
    }
}

此循环找到firstResponder:

- (UIView *)findFirstResponder {  
    UIView *firstResponderView = nil;
    for (UIView *view in [self entryFields]) {  
        if ([view isFirstResponder]) {  
            firstResponderView = view;
            break;
        }
    }   
    return firstResponderView;  
}

它依赖于视图中分配了标记的每个UITextField控件(同样,可以在Interface Builder中执行此操作)。

无论如何,我的两分钱,虽然我最好回馈一些东西!

答案 6 :(得分:2)

所以我为此苦恼,我想出来了......

你不需要其他按钮或任何东西。

您需要做的就是选择“文件所有者”,在检查器中将textField出口(或任何您命名的出口)拖动到您的实际文本字段(通过您命名的任何内容)这将是您输入的任何内容已经连线了。

当然除了控制插座(UIview通过检查员改为UIControl)通过backgroundtouched对文件所有者...我们都尝试过的第一件事

答案 7 :(得分:2)

它对我有用

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

只需要进入self.view就有一个UItextField

http://objdev.com/2013/11/Dismissing-iOS-Keyboard-Self-View-EndEditing

答案 8 :(得分:1)

从检查器的标识选项卡将类UIView更改为类UIControl。 加上这个:

- (IBAction)tabBackground:(id) sender;

到你的.h文件。

将此添加到.m文件中:

- (IBAction)tabBackgroup:(id) sender {
    [nameField resignFirstRespnder];
    [numberField resignFirstResponder];
}

将你的tabBackground从检查器,动作接收部分连接到UIView(这是一个UIControl),你很高兴。

答案 9 :(得分:1)

解决此问题的最合适方法是使用以下方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if(![touch.view isMemberOfClass:[UITextField class]]) {
        [touch.view endEditing:YES];
    }
}

注意:这不适用于UIScrollView实例。

答案 10 :(得分:0)

适用于swift 4.0

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    if touch?.phase == UITouchPhase.began {
        touch?.view?.endEditing(true)
    }
}