我有一个带有关联 UITableViewController 的 UITableView。但是,我已经修改了表格,使其也有一个带有文本字段子视图的视图。
与往常一样,我希望当用户点击“完成”(简单)以及触摸屏幕上除文本字段以外的任何其他位置(硬,卡住!)时键盘消失。
实现这一点的正常方法是将类更改为 UIControl 以便它可以处理操作......但我不能为我的 UITableView/UITableViewController 组合执行此操作。
我怎么解决这个问题?
我有一个带有关联 UITableViewController 的 UITableView。但是,我已经修改了表格,使其也有一个带有文本字段子视图的视图。
与往常一样,我希望当用户点击“完成”(简单)以及触摸屏幕上除文本字段以外的任何其他位置(硬,卡住!)时键盘消失。
实现这一点的正常方法是将类更改为 UIControl 以便它可以处理操作......但我不能为我的 UITableView/UITableViewController 组合执行此操作。
我怎么解决这个问题?
UITapGestureRecognizer
你可以通过在视图中添加一个来处理用户触摸。
例如,如果你不想在你的 tableView 中启用行选择,你调用self.tableView.allowsSelection = NO;
但是如果你仍然想检测用户触摸你添加一个UITapGestureRecognizer
到你的 tableView(或 tableView.superview)。
如果您实施 ,您可以拥有更多控制权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
}
// 这是可选的,它让你选择要接收的女巫触摸,例如这里我正在检查用户是否点击了文本字段
- (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
被调用。如果点击位于行内的文本字段,则调用文本字段委托。
因此,除了您的完成按钮方法之外,还要didSelectRowAtIndexPath
检查文本字段是否为第一响应者并要求其辞职。假设选定的 indexPath 不是文本字段的行。