单击UITableViewCell中的UITextField

Coo*_*coa 19 iphone cocoa-touch objective-c

我有一个问题,当在a textField中单击a时UITableViewCell,该方法tableView:didSelectRowAtIndexPath:不会被调用.问题是,我需要将我滚动tableView到正确的位置,否则键盘会在第一个响应者上方.

我必须像这样移动代码:

[[self tableView] scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Run Code Online (Sandbox Code Playgroud)

进入我的tableView委托方法和我的UITextField委托方法,textFieldDidBeginEditing:.

是创建新方法的最佳方法,将单击的单元格/文本字段的indexPath传递给它,并从tableView委托和UITextField委托调用该方法?更好的办法吗?

小智 22

我发现以下效果很好(假设你在表视图控制器中)

- (void)textFieldDidBeginEditing:(UITextField *)textField{  
    CGPoint pnt = [self.tableView convertPoint:textField.bounds.origin fromView:textField];
    NSIndexPath* path = [self.tableView indexPathForRowAtPoint:pnt];
    [self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
Run Code Online (Sandbox Code Playgroud)


小智 9

有几种方法可以解决这个问题.会发生的事情是tableViewCell将触摸事件委托给其子视图,这会导致文本字段处理触摸而不是您的单元格.

解决这个问题:

  • 将UITextfield的userinteractionEnabled属性设置为NO,然后当您获得didSelectRowAtIndexPath消息时,重新启用userInteractionEnabled并调用TextField的becomeFirstResponder.在v2.2上你甚至不需要设置userInteractionEnabled标志,我没有用其他版本测试过这个,但是文档很清楚你应该启用它.在tableViewController中,您只需要保存索引路径,直到获得UIKeyboardDidShow消息

  • 为UITextField创建一个委托,该委托报告回tableViewController,以便您可以从那里设置滚动偏移.

  • 注册键盘事件,然后通过检查编辑模式中的文本字段来确定scrolloffset


Aug*_*ust 6

您可以将控制器设置为UITextField的委托,然后在textFieldDidBeginEditing:或中调整表视图textFieldShouldBeginEditing: