我看到一些关于如何在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,使用这个方法,就像我在其他线程上看到的那样,但它可能有一个更简单的方法。
你能帮帮我吗?非常感谢!答案 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];
}
}