Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 正在为所有行调用HeightForRow索引路径&;性能问题之前,UITableView中有多少行?_Iphone_Ios_Uitableview_Heightforrowatindexpath - Fatal编程技术网

Iphone 正在为所有行调用HeightForRow索引路径&;性能问题之前,UITableView中有多少行?

Iphone 正在为所有行调用HeightForRow索引路径&;性能问题之前,UITableView中有多少行?,iphone,ios,uitableview,heightforrowatindexpath,Iphone,Ios,Uitableview,Heightforrowatindexpath,我想我已经读过了,对于UITableView,heightforrowatinexpath不会在所有行上被调用,而只会在可见的行上被调用。然而,这不是我所看到的。举个例子,我看到了数百个呼叫heightforrowatinexpath的简单情况,比如iPhone的方向被改变 因此,我在这里假设,对于实现了heightforrowatinexpath的UITableView,它(即heightforrowatinexpath)会被调用所有行(而不仅仅是可见行)…如果这不完全正确,请告诉我 问题:鉴

我想我已经读过了,对于
UITableView
heightforrowatinexpath
不会在所有行上被调用,而只会在可见的行上被调用。然而,这不是我所看到的。举个例子,我看到了数百个呼叫heightforrowatinexpath的简单情况,比如iPhone的方向被改变

因此,我在这里假设,对于实现了
heightforrowatinexpath
UITableView
,它(即
heightforrowatinexpath
)会被调用所有行(而不仅仅是可见行)…如果这不完全正确,请告诉我

问题:鉴于上述情况,在通常出现性能问题之前,
UITableView
(其中实现了
heightforrowatinexpath
)中可以有多少行?


有办法解决性能问题吗?i、 e.为每一行设置一个标称/标准高度,不执行
行高度索引路径
,但只有在显示时才正确设置每一行高度,并在此处正确设置……但哪种方法可以做到这一点

请查看中的讨论部分

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

使用tableView:heightForRowAtIndexPath:而不是rowHeight属性会影响性能。每次显示表视图时,它都会为其每一行在代理上调用tableView:heightForRowAtIndexPath:,这可能会导致具有大量行(大约1000行或更多行)的表视图出现严重的性能问题

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

AFAIK无法更改显示屏上的行高。

tableview之前必须知道正确的大小,否则会一直有难看的位置变化。

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

最后,我还找到了数百个呼叫heightForRowAtIndexPath和一个搜索 给我这根线。真烦人。 仅显示250个项目时,性能已经下降。谢天谢地,我现在要显示的单元格大小都相同。但是我可以想象有人想要为一个超过200个项目的tableView显示一些不同的单元格

修理这个苹果


干杯

我想我找到了解决办法

在iOS 7中,苹果引入了一些新的tableview属性。其中之一是:

tableView:estimatedHeightForRowAtIndexPath:
因此,如果提供估计的行高,例如,当在显示表之前重复调用tableView:heightforrowatinexpath:时,仅对表的可见单元格调用它;对于其余单元,将使用估计的高度


以下是这些信息的来源:

在具有大量行和动态单元格高度的TableView中,提高性能的一种方法是在首次计算单元格高度时缓存这些单元格的高度

实现这一点的简单方法是保留一个
NSMutableDictionary
,其中键是单元格中记录的id(或您可能拥有的任何其他标识符),值是一个带有行高度的
NSNumber
。首次计算高度后,根据记录id将其存储在
NSMutableDictionary
中。在
tableView:heightForRowAtIndexPath
tableView:estimatedHeightForRowAtIndexPath:
中,检查字典中的缓存高度,如果找到则返回。如果未找到,请计算高度,并在返回高度之前存储在缓存中

对于改变高度的行,可能必须小心使缓存无效。例如,如果在一个单元格中有一个展开按钮,则在点击展开按钮后,需要从缓存中删除该单元格的高度。调用高度的委托方法


当表格显示时,如果您试图同时显示1000个单元格,您可能仍然会受到性能影响,因为它可能会为每行调用height方法。解决方法是,如果可能的话,在后台任务中,在第一次显示单元格之前,首先预热缓存

哦,但是我这里有一个tableview,里面有大约500个项目,性能似乎很差-这似乎意味着你真的不能有一个tableview,里面有这么多行,实际上不是吗?这意味着你不能有500行不同的高度。如果所有行都具有相同的高度(在rowHeight属性中设置),那么对性能的影响应该不会太大。我真的希望苹果能够修复这个缺陷,即不能对大量行具有动态行高度。我很想知道是否有其他方法可以动态管理UITableView中的行数,并将行数保持在最小值。实际上,我不完全确定他们是否能够解决这个问题。出于完全不同的原因,我开始开发自己的定制tableView,目的是重新创建Apple的功能并添加自己的功能。我很快意识到我必须知道所有细胞的高度才能让它工作。因为无法预测表的位置(它可以通过编程跳转),所以必须准备在任何位置布局视图,这意味着您必须知道所有高度。唯一的替代方法是计算每个布局上以前的所有高度,这将是非常昂贵的。这让我很痛苦,但至少我有一个答案。你认为他们至少能做到,这样他们就能算出,比如说前50个r