2010-07-26 161 views
3

我看到一些关于如何在UITextField失去焦点时关闭键盘的线程,但它不适用于我,我不知道如何。下面的代码中的“touchesBegan:withEvent:”永远不会被调用。为什么?UITextField失去焦点时隐藏键盘

- (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的子类,以便像我在其他线程中看到的那样使用此方法,但它可能有一个更简单的方法。

你能帮我吗?非常感谢!

回答

2

确保在IB中将UITextFielddelegate设置为First Responder。我只是在屏幕上放置了一个自定义(隐形)UIButton,并设置了IBAction来隐藏键盘。例如:

- (IBAction)hideKeyboard { 
    [someTextField resignFirstResponder]; 
} 

随着那迷上了UIButton

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

这里是我的解决方案,有些由几个职位的SO启发:只要处理在View的背景下敲击手势,用户在“明显”试图离开的UITextField的焦点。

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

这是在ViewController中实现的。处理程序被添加作为手势识别在查看属性的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];  
} 

的处理程序可以在视图以及定义。如果您不熟悉处理手势,请参阅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; 
}