2012-08-04 75 views
1

我有一个UITableView与关联的UITableViewController。不过,我已经修改了表格以使其也具有textfield子视图。UITableView - 在外部触摸上退出第一响应者

与往常一样,当用户点击“完成”(简单)和触摸屏幕上除文本字段以外的任何其他位置(困难,卡住!)时,我希望键盘消失。

实现此目的的正常方法是将类更改为UIControl,以便它可以处理操作...但我无法为我的UITableView/UITableViewController组合执行此操作。

我该如何解决这个问题?

回答

5

U可以通过在您的视图中添加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 
} 
+0

之后这个效果很好。唯一看起来很奇怪的是我必须在textField上调用resignFirstResponder,而不是在通常用于清除键盘的视图上。 – ConfusedNoob 2012-08-04 22:49:14

+1

你通常在textField上调用resignFirstResponder而不是视图,但是如果你真的想要某种视图(可能不是),你可以调用[self.view endEditing],这个我相信也会做到这一点...... – Eyal 2012-08-04 23:09:31

+2

如上所述通过@Matt里斯在这个其他线程(http://stackoverflow.com/a/11142038/285853),你需要设置tapGesture.cancelsTouchesInView = NO;如果你希望其他意见像往常一样保持接触。 – Miros 2014-03-17 14:50:07

3

通常的做法是在键盘视图后面放置一个自定义UIButton(它只有在uitextfield开始编辑时才可见),并且当用户单击屏幕时,他实际上点击了该按钮,并且关联的选择器可以退出第一响应者。

-(void) closeKeyboard:(UIButton *) b { 
    [self.view endEditing:YES]; //assuming self is your top view controller. 
    [b setHidden:YES]; 
} 

使用endEditing更好,因为它遍历所有子视图并查找当前第一响应者。

+0

这不是说他们不能轻易点击文本框本身,例如选择和移动光标吗? – ConfusedNoob 2012-08-04 16:48:27

+0

如果你将这个按钮放在uitextfield下,那么不会,它不会 – 2012-08-04 17:13:12

+1

Upvote用于指向'endEditing:'方法。如果菜单按钮被点击,我想要关闭键盘。这很容易。 – 2013-09-30 07:10:32

0

当点击一行时,调用didSelectRowAtIndexPath。如果轻击位于行内的textField,则调用文本字段委托。

因此,除了您的完成按钮方法,在didSelectRowAtIndexPath添加检查文本字段是第一响应者,并要求它辞职。假设选定的indexPath不是文本字段的行。

+0

我不希望表中的行可以选择..所以我不认为这种方法可行。 – ConfusedNoob 2012-08-04 16:49:31

+0

将选择颜色设置为等于cellForRowAtIndexpath中的背景颜色。在didSelectRowAtIndexPath中立即取消选择任何选定的行。效果应该是你在 – Olaf 2012-08-05 14:26:10

2

使用页头打破了ARC启用

只需添加以下到ViewController

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    //where text field is a @property (nonatomic,retain) IBOutlet to your textfield 
    [textField resignFirstResponder]; 
} 
相关问题