我有一个带有多个文本框的UIView。现在我已经使用委托将响应者从文本字段更改为另一个。在这种情况下,当用户到达最后一个文本字段时,我的键盘会消失。
但现在我想在用户触摸UIView时隐藏我的键盘(除了文本框之外触摸屏幕上的任何位置)。有人可以帮我解决这个问题。
由于
答案 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)
}
}