IndexPathForCell和IndexPathForRowAtPoint崩溃

时间:2013-04-22 22:27:04

标签: ios uitableview nsindexpath heightforrowatindexpath

我有UITableViewController个静态分组单元格。在特定的视图中,我想删除一些单元格。如果我只是隐藏它们,它会留下一个空白空间,所以我想将单元格的rowHeight设置为0。我无法做到这一点,因为我似乎无法获取我想要隐藏的单元格的indexPath。我通过IB连接引用它。阅读后,似乎最好的方法是通过heightForRowAtIndexPath方法。这是我的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *myIndexPath = [self.tableView indexPathForRowAtPoint:self.billToPostalCell.center]; 
    //crashes here

    if ([indexPath isEqual:myIndexPath]) {
        return 0; 
    }
    return 44;
}

在此之前,我正在尝试IndexPathForCell,但也会崩溃。根据我的阅读,即使单元格不可见,heightForRowAtIndexPath也应该有效。当它崩溃时,调试器中也没有显示任何内容。

3 个答案:

答案 0 :(得分:3)

你正在做的是导致无限递归导致...等待它......堆栈溢出!

heightForRowAtIndexPath:方法中,您不能向表中询问单元格或行的indexPath,因为这些方法需要知道单元格的高度。所以这些调用导致调用heightForRowAtIndexPath:。然后,由于你再次使用相同的违规方法,这种情况一直持续到事情发展为止。

由于您的目标是隐藏单元格,因此应使用正确的UITableView方法(deleteRowsAtIndexPaths:withRowAnimation:)从表格中删除单元格。当然,您需要先更新数据模型(删除行)。

答案 1 :(得分:2)

您不应该更改单元格的可见性和高度。如果要删除单元格并稍后将其添加回来,或者从不添加它们,则应使用UITableView上的insert和delete方法。这是一个很好的起点documentation

此外,您不应该在tableView:heightForRowAtIndexPath:内部使用tableView上的方法,例如indexPathForRowAtPoint:,因为tableView必须先计算出自己的高度才能计算出类似的内容。您可能会因为处于无限循环而收到错误。

答案 2 :(得分:0)

使用-deleteRowsAtIndexPaths:withRowAnimation删除行。永远不要操纵细胞的可见性来代替移除细胞;这可能导致严重的记忆问题,这只是一般的不良做法。只需传入NSArray,其中包含您要移除的行的NSIndexPath

您提到indexPathForRowAtPoint:方法无效。这几乎肯定是你传递给它的一个问题。请务必注销billToPostalCell.center的值,以确保传入合法值。但是,如果您正在处理静态单元格,则确实没有必要这样做,因为您应该已经知道索引路径(至少对于初始单元格移除)。

正如其他人所提到的,移除单元格的documentation提供了您应该需要的所有其他信息。