[英]UITableView - resign first responder on outside touch
我有一个带有关联的UITableViewController的UITableView。 但是,我已经修改了表格,使其具有一个带有textfield子视图的视图。
和往常一样,我希望键盘在用户点击“完成”(轻松)并且触摸屏幕上除文本字段之外的其他任何位置(硬,卡住!)时消失。
实现此目的的通常方法是将类更改为UIControl,以便它可以处理操作...但是我无法对UITableView / UITableViewController组合执行此操作。
我怎么解决这个问题?
U可以通过将UITapGestureRecognizer
添加到视图来处理用户触摸。
例如,如果您不想在tableView中启用行选择,请调用self.tableView.allowsSelection = NO;
但是,如果您仍然要检测用户的触摸,请向您的tableView(或tableView.superview)添加一个UITapGestureRecognizer
。
如果您实现UIGestureRecognizerDelegate
,则您可以拥有更多控制权,这样您就可以检测并选择女巫触摸来接收,而没有女巫。
为此,只需将此代码添加到您的UITableViewController
:
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.allowsSelection = NO;
UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)];
tgr.delegate = self;
[self.tableView addGestureRecognizer:tgr]; // or [self.view addGestureRecognizer:tgr];
[tgr release];
}
- (void)viewTapped:(UITapGestureRecognizer *)tgr
{
NSLog(@"view tapped");
// remove keyboard
}
//这是可选的,它允许您选择要接收的女巫触摸,例如,在这里我要检查用户是否点击了textField
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isKindOfClass:[UITextField class]]) {
NSLog(@"User tapped on UITextField");
}
return YES; // do whatever u want here
}
通常的做法是将自定义UIButton(仅当uitextfield开始编辑时才可见)在键盘视图后面,并且当用户单击屏幕时,他实际上单击了该按钮,并且关联的选择器可以退出第一响应者。
-(void) closeKeyboard:(UIButton *) b {
[self.view endEditing:YES]; //assuming self is your top view controller.
[b setHidden:YES];
}
使用endEditing更好,因为它遍历所有子视图并寻找当前的第一响应者。
在启用ARC的情况下使用分配中断
只需将以下内容添加到viewController
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//where text field is a @property (nonatomic,retain) IBOutlet to your textfield
[textField resignFirstResponder];
}
当点击一行时, didSelectRowAtIndexPath
被调用。 如果点击位于行内的textField,则调用textfield委托。
因此,除了您的done按钮方法外,在didSelectRowAtIndexPath
添加了对作为第一响应者的文本字段的检查,并要求其退出。 假设选定的indexPath不是文本字段的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.