如何从其子视图中获取UITableViewCell

mlu*_*own 13 uitableview ios

我有UITableView一个UITextField在每个UITableViewCells.我在我的ViewController中有一个方法,它处理每个单元格的文本字段的"Do End On Exit"事件,我想要做的是用新文本更新我的模型数据.

我现在拥有的是:

- (IBAction)itemFinishedEditing:(id)sender {
    [sender resignFirstResponder];

    UITextField *field = sender;
    UITableViewCell *cell = (UITableViewCell *) field.superview.superview.superview;

    NSIndexPath *indexPath = [_tableView indexPathForCell:cell];

    _list.items[indexPath.row] = field.text;
}
Run Code Online (Sandbox Code Playgroud)

当然做起field.superview.superview.superview作用,但它似乎是如此hacky.有更优雅的方式吗?如果我设置的标签UITextFieldindexPath.row其在细胞中的cellForRowAtIndexPath意志标签总是甚至插入和删除行后是正确的?

对于那些密切关注的人,你可能会认为我有一个.superview太多,而对于iOS6,你是对的.但是,在iOS7中,在单元格的内容视图和单元格本身之间的层次结构中有一个额外的视图(NDA阻止我形成详细说明).这恰恰说明了为什么做superview的事情有点hacky,因为它取决于知道如何UITableViewCell实现,并且可以打破操作系统的更新.

rma*_*ddy 31

由于您的目标是获取文本字段的索引路径,因此您可以这样做:

- (IBAction)itemFinishedEditing:(UITextField *)field {
    [field resignFirstResponder];

    CGPoint pointInTable = [field convertPoint:field.bounds.origin toView:_tableView];    

    NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:pointInTable];

    _list.items[indexPath.row] = field.text;
}
Run Code Online (Sandbox Code Playgroud)


Cez*_*zar 12

一种稍微好一点的方法是遍历视图层次结构,检查每个超级视图是否UITableViewCell使用该class方法.这样,您就不会受到您UITextField和单元格之间的超级视图数量的限制.

有点像:

UIView *view = field;
while (view && ![view isKindOfClass:[UITableViewCell class]]){ 
    view = view.superview;
}
Run Code Online (Sandbox Code Playgroud)