indexPathForCell从ios7开始返回nil

Lud*_*ier 18 objective-c uitableview ios ios7

我的应用程序在ios6.1下正常运行.尝试了ios7模拟器,以下部分不起作用:

EditingCell *cell = (EditingCell*) [[textField superview] superview];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
NSLog(@"the section is %d and row is %d", indexPath.section, indexPath.row);
NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];
NSString *rowKey = [[keysForRows objectAtIndex: section] objectAtIndex: row];
Run Code Online (Sandbox Code Playgroud)

总是来:

the section is 0 and row is 0
Run Code Online (Sandbox Code Playgroud)

虽然选择了另一个部分/行.有人知道为什么这在ios7下不起作用?

Mar*_*n R 30

您查找文本字段的"封闭"表格视图单元格的方法很脆弱,因为它假设一个固定的视图层次结构(在iOS 6和iOS 7之间似乎已经更改).

一种可能的解决方案是在视图层次结构中遍历,直到找到表视图单元格:

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

一个完全不同但经常使用的方法是使用行号"标记"文本字段:

cell.textField.tag = indexPath.row;   // in cellForRowAtIndexPath
Run Code Online (Sandbox Code Playgroud)

然后在文本字段委托方法中使用该标记.

  • 有一种情况,使用标签可能不起作用.如果您在表视图上具有peforms -insertRowsAtIndexPaths的代码,则标记将与indexPath.row不匹配. (4认同)

dre*_*arp 22

我发现细胞的方式和你一样.现在我使用这个快速方法,如果我在一个单元格中有一个按钮,并且知道我在的tableview.它将返回tableviewcell.

-(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id)sender {
    CGPoint pos = [sender convertPoint:CGPointZero toView:tableView];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:pos];
    return [tableView cellForRowAtIndexPath:indexPath];
}
Run Code Online (Sandbox Code Playgroud)

  • 这绝对应该是答案.视图层次结构中的中继越少越好. (3认同)