我有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
也应该有效。当它崩溃时,调试器中也没有显示任何内容。
答案 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提供了您应该需要的所有其他信息。