UITableView - 在外部触摸时重新响应第一响应者

时间:2012-08-04 15:32:56

标签: ios xcode cocoa-touch uitableview

我有一个带有关联UITableViewController的UITableView。但是,我已经修改了表格,也有一个带有文本字段子视图的视图。

与往常一样,我希望键盘在用户点击“完成”(简单)时以及当他们触摸屏幕以外的任何其他位置(硬盘,卡住!)时消失。

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

我该如何解决这个问题?

4 个答案:

答案 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不是文本字段的行。