indexPathForCell从ios7开始返回nil

时间:2013-09-11 13:50:41

标签: ios objective-c uitableview 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];
总是来:

the section is 0 and row is 0

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

3 个答案:

答案 0 :(得分:30)

找到文本字段的“封闭”表格视图单元格的方法很脆弱, 因为假设一个固定的视图层次结构(似乎在它们之间发生了变化) iOS 6和iOS 7)。

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

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

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

cell.textField.tag = indexPath.row;   // in cellForRowAtIndexPath

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

答案 1 :(得分: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];
}

答案 2 :(得分:0)

在iOS 11中遇到此问题,但在9或10中没有遇到此问题,我使用@drexel-sharp之前详述的技术覆盖了func indexPath(for cell: UITableViewCell) -> IndexPath?方法:

override func indexPath(for cell: UITableViewCell) -> IndexPath? {
    var indexPath = super.indexPath(for: cell)
    if indexPath == nil { // TODO: iOS 11 Bug?
        let point = cell.convert(CGPoint.zero, to: self)
        indexPath = indexPathForRow(at: point)
    }
    return indexPath
}