【问题标题】:indexPathForCell returns nil since ios7indexPathForCell 自 ios7 起返回 nil
【发布时间】:2013-09-15 14:10:13
【问题描述】:

我的应用在 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 下不起作用吗?

【问题讨论】:

  • 您是否验证过 textfield.superview.superview 是KindOfClass EditingCell?单元格的视图层次结构可能已更改。
  • [[textField superview] superview] 是一种非常糟糕的引用方式。
  • 我得到了这个应用程序......并希望让它在 iOS 7 下运行。
  • 如何验证编辑单元格是否是kindofclass? (我对 ios 开发非常陌生..)
  • 要找出你的单元格是什么类,试试NSLog(@"Class of Cell: %@", NSStringFromClass(cell.class)); 你也可能想查看 UITableView-Method ìndexPathOfSelectedCell`。希望对您有所帮助。

标签: ios objective-c uitableview ios7


【解决方案1】:

在 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
}

【讨论】:

    【解决方案2】:

    您查找文本字段的“封闭”表格视图单元格的方法很脆弱, 因为 is 假定一个固定的视图层次结构(这似乎在 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
    

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

    【讨论】:

    • 很好,这行得通(第一个解决方案)。有什么要关心的吗?还是这是正常(或一种正常)的方式?
    • 存在使用标签可能不起作用的情况。如果您有在表格视图上执行 -insertRowsAtIndexPaths 的代码,则标签将与 indexPath.row 不匹配。
    • @PaulHeller:它应该匹配所有 visible 单元格,因为它总是在 cellForRowAtIndexPath 中更新,但你是对的,你的反对意见也使标记方法看起来很脆弱。
    • 如果行滚动出视图,superview 可以返回 nil 并让您陷入无限循环
    • @BradThomas:我曾假设在单元格内控件的委托/操作方法中,单元格是可见的。但是您永远不会知道,并且绝对应该添加对 nil superview 的检查(添加到答案中)。感谢您的反馈!
    【解决方案3】:

    我发现细胞的方法和你一样。现在,如果我在单元格中有一个按钮并且知道我所在的表格视图,我会使用这种快速方法。它将返回表格视图单元格。

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

    【讨论】:

    • 这绝对是答案。视图层次结构的中继越少越好。
    • 谢谢!像魅力一样工作!
    • 当 indexPathForCell 出于任何原因返回 nil 时效果很好。在 iOS 8 上验证
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多