我有一个带有关联UITableViewController的UITableView。但是,我已经修改了表格,也有一个带有文本字段子视图的视图。
与往常一样,我希望键盘在用户点击“完成”(简单)时以及当他们触摸屏幕以外的任何其他位置(硬盘,卡住!)时消失。
实现这一目标的正常方法是将类更改为UIControl,以便它可以处理操作......但我不能为我的UITableView / UITableViewController组合执行此操作。
我该如何解决这个问题?
答案 0 :(得分:5)
您可以在视图中添加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
}
答案 1 :(得分:3)
通常的做法是在键盘视图后面放置一个自定义UIButton(它只在uitextfield开始编辑时才可见),当用户点击屏幕时,他实际上点击了该按钮,相关的选择器可以让第一个响应者辞职。
-(void) closeKeyboard:(UIButton *) b {
[self.view endEditing:YES]; //assuming self is your top view controller.
[b setHidden:YES];
}
使用endEditing更好,因为它遍历所有子视图并查找当前的第一响应者。
答案 2 :(得分:2)
在启用ARC的情况下使用alloc break
只需将以下内容添加到viewController
即可- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//where text field is a @property (nonatomic,retain) IBOutlet to your textfield
[textField resignFirstResponder];
}
答案 3 :(得分:0)
点击一行时,会调用didSelectRowAtIndexPath
。如果点击位于行内部的textField,则调用textfield委托。
因此,除了完成按钮方法之外,在didSelectRowAtIndexPath
中添加对作为第一响应者的文本字段的检查并要求其辞职。假设所选的indexPath不是文本字段的行。