我有一个带有多个文本框的UIView。现在我已经使用代理将响应者从一个文本字段更改为另一个文本字段。在这种情况下,当用户到达最后一个文本框时,我的键盘会消失。
但现在我想在用户触摸UIView时(除了文本框之外的任何屏幕位置),隐藏我的键盘。有人能帮我吗?
谢谢
我有一个带有多个文本框的UIView。现在我已经使用代理将响应者从一个文本字段更改为另一个文本字段。在这种情况下,当用户到达最后一个文本框时,我的键盘会消失。
但现在我想在用户触摸UIView时(除了文本框之外的任何屏幕位置),隐藏我的键盘。有人能帮我吗?
谢谢
在touchesBegan方法中使用resignFirstResponder,如下所示:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
[self.myTextField resignFirstResponder];
}
}
如果您不确定当前焦点所在的位置,可能需要在多个文本字段上调用此方法;我没有测试过这种情况。
另外,在界面构建器中,您需要启用视图的“用户交互启用”复选框,或者通过编程实现:
myView.userInteractionEnabled = YES;
当您想要隐藏键盘时,只需在您的视图控制器中调用以下代码:
[self.view endEditing:NO];
我使用
-(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;
}
}
}
}
[myTextFieldOne resignFirstResponder];
[myTextFieldTwo resignFirstResponder];
基本上,将resignFirstResponder
消息发送到您的每个文本字段或任何可以产生键盘的字段。
实际上,我对iPhone SDK非常陌生。我不知道这是否是最好的方法,但它有效,并且是我从上述书籍中学到的。希望能有所帮助。
- (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)。
我知道楼主可能已经不再需要这个,但我只是想与其他遇到相同问题的人分享。
这对我来说是有效的
-(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
谢谢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
控件都有一个tag(可以在Interface Builder中完成)。
这只是我的个人意见,但我想回馈一些东西!
所以我煞费苦心终于弄明白了...
你不需要其他按钮或任何东西。
你只需要选择 "文件拥有者",在检查器中从其 textField 输出 (或您命名的任何内容) 拖动到您实际的文本字段上(通过您命名的任何内容)。这将是除了您已经连接的任何输入之外的一个额外步骤。
当然,在控制输出(UIView 通过检查器更改为 UIControl) 到文件拥有者 via backgroundtouched... 这是我们所有人试过的第一件事。
- (IBAction)tabBackground:(id) sender;
- (IBAction)tabBackgroup:(id) sender {
[nameField resignFirstRespnder];
[numberField resignFirstResponder];
}
从检查器中连接您的tabBackground,将操作接收部分连接到UIView(它是UIControl),然后您就可以开始了。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if(![touch.view isMemberOfClass:[UITextField class]]) {
[touch.view endEditing:YES];
}
}