当UITextField失去焦点时隐藏键盘

时间:2010-07-26 21:00:05

标签: iphone focus uitextfield

我看到一些关于如何在UITextField失去焦点时解雇键盘的线索,但它对我不起作用,我不知道如何。以下代码中的“touchesBegan:withEvent:”永远不会被调用。为什么呢?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if ([self.textFieldOnFocus isFirstResponder] && [touch view] != self.textFieldOnFocus) {
        [textFieldOnFocus resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

P.S。:此代码已插入具有UITableView的视图控制器中。 UITextField位于此表的单元格中。

所以,我的观点是:这个方法没有被调用,导致触摸发生在我的ViewController的UITableView上。所以,我认为,我必须继承UITableView,使用这个方法,就像我在其他线程上看到的那样,但它可能有一个更简单的方法。

你能帮帮我吗?非常感谢!

3 个答案:

答案 0 :(得分:2)

确保在IB中将delegate的{​​{1}}设置为UITextField。我只是在屏幕上放置一个自定义(不可见)First Responder并设置UIButton来隐藏键盘。例如:

IBAction

将其连接到- (IBAction)hideKeyboard { [someTextField resignFirstResponder]; }

答案 1 :(得分:2)

这是我的解决方案,有点受到SO中的几个帖子的启发:只需在View的上下文中处理点击手势,用户“显然”试图离开UITextField的焦点。

-(void)handleViewTapGesture:(UITapGestureRecognizer *)gesture
{
    [self endEditing:YES];
}

这是在ViewController中实现的。处理程序作为手势识别器添加到View属性的setter中的相应View:

-(void) setLoginView:(LoginView *)loginView
{
    _loginView = loginView;

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.loginView action:@selector(handleTapGesture:)];    

    [tapRecognizer setDelegate:self];  // self implements the UIGestureRecognizerDelegate protocol

    [self.loginView addGestureRecognizer:tapRecognizer];    
}

处理程序也可以在View中定义。如果您不熟悉处理手势,请参阅Apple的文档,其他地方有大量样本。

我应该提一下,你需要一些额外的代码来确保其他控件获得点击,你需要一个实现UIGestureRecognizerDelegate协议的委托和这个方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{    
    if ([touch.view isKindOfClass:[UIButton class]])    // Customize appropriately.
        return NO; // Don't let the custom gestureRecognizer handle the touch   

    return YES;
}

答案 2 :(得分:0)

-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event
 {
    for (UIView* view in self.view.subviews) 
    {
        if ([view isKindOfClass:[UITextField class]])
        [view resignFirstResponder];
    }
}