繁体   English   中英

UITableView-在外部触摸时辞职第一响应者

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM