当用户触摸uiview时隐藏键盘

问题描述:

我有一个包含多个文本框的UIView。现在我已经使用委托将响应者从文本字段更改为另一个字段。在这种情况下,当用户进入上一个文本字段时,我的键盘会消失。当用户触摸uiview时隐藏键盘

但现在我想隐藏我的键盘,当用户触摸UIView(触摸屏幕上的任何地方除了文本框)。有人可以帮我弄这个吗。

感谢

使用resignFirstResponder中的touchesBegan,像这样:

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

您可能需要,如果你不知道在哪里焦点当前位于调用此对多个文本字段;我没有测试过这种情况。

此外,在界面生成器,你将需要启用该视图的“已启用用户交互”复选框,或编程使用:

myView.userInteractionEnabled = YES; 
+0

但是,在调用此resignFirstResponder 。如何知道用户触摸了UIView? – nbojja 2009-06-08 06:09:31

+1

我已编辑帖子,在touchesBegan中包含一个示例。 – PCheese 2009-06-08 06:37:01

+0

嘿..感谢您的帮助..它与UIView很好地合作。但我有另一个场景,我在UITableView中有文本框。在这种情况下,你的代码不工作。我对iPhone开发非常陌生,所以请...... – nbojja 2009-06-08 07:13:30

Beginning iPhone Development,你画一个圆矩形按钮,这样它涵盖了你的整个UI;完整的屏幕。然后转到布局菜单并单击发送到后面。然后在检查员中,将按钮的类型从round rect更改为自定义。现在,向这个按钮添加一个触摸内部事件并将其附加到处理它的方法。在这个方法的身体,请确保您有语句:

[myTextFieldOne resignFirstResponder]; 
[myTextFieldTwo resignFirstResponder]; 

基本上发送resignFirstResponder消息发送到每个文本字段,或能产生一个键盘的任何领域。

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

感谢Blaenk,我正在努力解决如何做到这一点,并没有意识到我可以把一个按钮放在后台,很好的把戏!这里是我的贡献(新来这个网站,并可可触及,因此它可能不是最强大的代码以往,但它的工作迄今...):

我打电话从touchUpInside事件这个方法对我的UIButton:

-(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控件,可以做THA在Interface Builder中)。

无论如何,我的两分钱,尽管我最好还给回来!

我用

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

SO我苦苦思索这一点,我想通了..

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

所有你需要做的就是选择“文件所有者”,在检查器中从其textField出口(或任何你命名它)拖到你的实际文本框(通过你命名的任何东西)这将是除了任何输入你已经连线了。

和ofcourse除了控制出口通过backgroundtouched ...的第一件事,我们都试图

改变类的UIView类UIControl从的识别标签(的UIView通过检查改为UIControl),以文件的所有者督察。 补充一点:

- (IBAction)tabBackground:(id) sender; 

您.h文件中。

添加到您的.m文件:

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

您tabBackground从检查连接,操作中收到部分UIView的(这是一个UIControl),你是好去。

只需在视图控制器中调用此选项即可隐藏键盘。

[self.view endEditing:NO];

一个超级简单的方法做,这是什么工作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可能不会仍然需要这个,但我只是想分享给他人与同样的问题。

解决这个问题是使用下面的方法的最适当的方法:

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

注:这不会对UIScrollView的情况下工作。

对我来说

-(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

为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) 
    } 
}