0

我有UITableViewController静态分组单元格。在特定视图中,我想删除一些单元格。如果我只是隐藏它们,它会留下一个空白空间,所以我想将单元格设置rowHeight0。我在执行此操作时遇到了麻烦,因为我似乎无法获得要隐藏的单元格的 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,即使细胞不可见,也应该可以工作。当它崩溃时,调试器中也没有任何显示。

4

3 回答 3

3

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

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

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

于 2013-04-22T22:49:23.587 回答
2

您不应该更改单元格的可见性和高度。如果您想删除单元格并稍后添加它们,或者从不添加它们,您应该使用 UITableView 上的插入和删除方法。这是一个很好的起点文档

此外,您不应该从内部使用 tableView 上的方法,tableView:heightForRowAtIndexPath:因为indexPathForRowAtPoint:tableView 必须先计算出自己的高度,然后才能计算出这样的东西。您可能会遇到错误,因为您处于无限循环中。

于 2013-04-22T22:40:59.337 回答
0

用于-deleteRowsAtIndexPaths:withRowAnimation删除行。切勿操纵单元格的可见性来代替删除它;这可能会导致严重的内存问题,并且只是一般的不良做法。只需传入一个NSArray填充了NSIndexPath您要删除的行的 。

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

正如其他人所提到的,有关删除单元的文档提供了您应该需要的所有其他信息。

于 2013-04-22T22:47:35.773 回答