为所有行调用heightForRowAtIndexPath&在性能问题之前,UITableView中有多少行?

时间:2011-03-16 10:50:18

标签: iphone ios uitableview heightforrowatindexpath

我以为我已经读过UITableView heightForRowAtIndexPath heightForRowAtIndexPath没有在所有行上调用,而只是在那些可见的行上调用。然而,这不是我所看到的。我看到了UITableView的数百次调用,例如iPhone的方向改变的简单情况。

所以我在这里假设,对于heightForRowAtIndexPath已实现heightForRowAtIndexPath,它会(即UITableView)调用所有行(不仅仅是可见的行)。我知道这是不是很正确。

问题:鉴于上述问题,在性能问题发生之前,您可以在heightForRowAtIndexPath(实现heightForRowAtIndexPath的地方)中有多少行?

是否有解决性能问题的方法?即为每一行设置标称/标准高度而不实现{{1}},但是只有在显示时才正确设置每一行高度并在此处正确设置...但是这样做的方法是什么?

3 个答案:

答案 0 :(得分:8)

查看tableView:heightForRowAtIndexPath: documentation

中的讨论部分
  

该方法允许委托指定具有不同高度的行。如果实现了此方法,则它返回的值将覆盖为给定行的UITableView的rowHeight属性指定的值。

     

使用tableView:heightForRowAtIndexPath:而不是rowHeight属性会对性能产生影响。每次显示表视图时,它都会在每个行的委托上调用tableView:heightForRowAtIndexPath:这会导致表视图具有大量行(大约1000或更多)的显着性能问题。

因此,您应该使用UITableView的rowHeight属性。如果你需要不同的高度,那你就不幸了,因为你必须使用tableView:heightForRowAtIndexPath:

AFAIK无法在显示时更改行高 tableview必须知道之前的正确大小,否则会一直存在丑陋的位置变化。

答案 1 :(得分:1)

天哪,我花了一个多小时试图找到性能问题的根源!

最后,我还发现了数百次调用heightForRowAtIndexPath和搜索 给了我这个帖子。那太烦人了。 当只显示250个项目时,性能已经下降。值得庆幸的是,我想要显示的单元格大小都相同。但我可以想象有人想要为一个带有>的tableView显示一些不同的单元格。 200项!

修复这个苹果!

干杯

答案 2 :(得分:1)

在具有大量行和动态单元格高度的tableView中提高性能的一种方法是在首次计算单元格后缓存单元格的高度。

实现这一目标的一种简单方法是保留一个NSMutableDictionary,其中密钥是单元格中记录的id(或者您可能拥有的任何其他标识符),并且值为{{1} }与行的高度。首次计算高度后,将NSNumber存储为记录ID。在NSMutableDictionarytableView:heightForRowAtIndexPath中,您检查字典中的缓存高度,如果找到则返回它。如果未找到,请计算高度,并在返回高度之前存储在缓存中。

您可能必须小心使高速缓存中的行的高速缓存失效。例如,如果您的某个单元格中有一个展开按钮,则在调用展开按钮时,您需要从缓存中删除该单元格的高度。调用高度委托方法。

如果您在表格显示时尝试同时显示1000个单元格,则可能仍会有性能损失,因为它可能会调用每行的高度方法。解决此问题的方法是在首次显示单元格之前,首先在后台任务中加热缓存(如果可能)。