Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Ios 滚动UITableView时,几乎没有不同类型的单元格不够平滑_Ios_Performance_Uitableview_Reuseidentifier - Fatal编程技术网

Ios 滚动UITableView时,几乎没有不同类型的单元格不够平滑

Ios 滚动UITableView时,几乎没有不同类型的单元格不够平滑,ios,performance,uitableview,reuseidentifier,Ios,Performance,Uitableview,Reuseidentifier,我需要在一个非常复杂的表视图中有几个不同的单元格类型。我在那些具有不同重用标识符的不同单元类中注册了10个xib。问题是,当我第一次滚动表格视图时(从上到下),我可以看到它有点滞后。然而,在我滚动到底部之后,再滚动到顶部和底部,运行起来很平稳。问题似乎出在dequeueReusableCellWithIdentifier中:如果此时没有所需类型的可重用单元格,则在滚动时加载不同的xib文件的速度似乎不够快。这就是为什么第一次滚动是滞后的,但当每种类型有足够的可重用单元加载后,它开始平滑滚动 是否

我需要在一个非常复杂的表视图中有几个不同的单元格类型。我在那些具有不同重用标识符的不同单元类中注册了10个xib。问题是,当我第一次滚动表格视图时(从上到下),我可以看到它有点滞后。然而,在我滚动到底部之后,再滚动到顶部和底部,运行起来很平稳。问题似乎出在dequeueReusableCellWithIdentifier中:如果此时没有所需类型的可重用单元格,则在滚动时加载不同的xib文件的速度似乎不够快。这就是为什么第一次滚动是滞后的,但当每种类型有足够的可重用单元加载后,它开始平滑滚动


是否有任何方法可以预加载UITableView的可重用单元。例如,我可以将每个xib类型加载3次(这样tableview在内存中已经加载了30个可重用单元(10个单元类型中的每一个都加载了3个),当调用dequeueReusableCellWithIdentifier时)?我需要稍后在应用商店上发布应用,因此不允许使用任何私有api。或者,在这种情况下,您是否有其他可能的解决方案来提高性能?

如果您在应用程序中使用故事板,则在将tableView的父视图控制器声明为UITableViewDelegate后,可以在表定义中定义多个单元格类型

您可能是对的,XIB的初始负载会使您死亡。

我记得,CoreGraphics将在每个单元格第一次出现时遍历它,并执行一些混合计算,以使标签和视图显示为您设计的样子

通过在InterfaceBuilder中将每个视图(标签、按钮、视图)设置为不透明,可以缓解某些速度减慢的情况

减少包含alpha!=1.

将背景设置为白色,或您使用的任何颜色,而不是透明

查看这家伙的解释和示例代码,了解他如何使滚动速度尽可能快,以获得非常动态的表视图


*链接是一个古老的例子,但原则仍然适用于AIK

使用预加载的单元格创建辅助缓存解决了滚动问题。在viewDidLoad上,我正在注册nib(使用registerNib:forCellReuseIdentifier:),然后在viewDidLoad中,我正在创建一个可变数组,并使用dequeueReusableCellWithIdentifier:为每个nib加载几个单元格,然后将这些单元格放入可变数组中。稍后在cellForRowAtIndexPath中,我首先检查是否在可变数组中预加载了具有所需类型的单元格。若我有它,那个么我返回这个单元格并将其从数组中移除(在这种情况下,我不调用dequeueReusableCellWithIdentifier:)。如果缓存中没有它,则调用dequeueReusableCellWithIdentifier:获取该单元格

编辑: 结果表明,延迟的主要原因是我在awakeFromNib中使用的一些简单的反应性cocoa绑定。移除这些反应性cocoa绑定后,即使没有任何额外的单元格预加载,所有内容也开始平滑滚动。

我使用了一种技巧

1) 在实际单元格的前面添加几个零高度单元格

2) 按你的要求把它排出来

3) 将cell.cliptobunds设置为YES


现在完成了。

是的,我需要10个不同的xib,布局完全不同,所以说我不需要它们对我没有多大帮助:)还有其他建议吗?你可以有10个不同的布局。你只需要把它们放在同一个XIB中。看箭头在哪里。您可以在此处设置自定义单元格的数量。然后在加载视图控制器时一次性加载XIB,您的问题应该消失。您的意思是我应该在其内容视图下方的一个UITableViewCell中,将不同的布局一个接一个地放在其上吗?是的,这可能会解决滚动时单元格加载太慢的问题,但这不是一个非常优雅的解决方案,而且很难维护,因此我将寻找其他解决方案。是的。您可以在左侧看到表视图单元格列表。每个都可以有自己的布局。每一个都应该有自己的重用标识符,并且为了您自己的理智,您绝对应该在资源管理器上重命名单元格。我同意UI可能有点难以使用,但它是为解决您的问题而设计的。我支持一个有10种不同结果类型的应用程序,所以我们有10个自定义单元格原型。好的,我现在明白你的意思了。谢谢你的建议。我不确定这是否会有帮助,但在我正在工作的项目中,我无论如何都不能使用故事板,不幸的是,xib中的视图控制器不支持动态单元原型。您认为在模拟器上落后还是仅在设备上落后(什么类型的设备/iOS版本)?如果dequeueReusableCellWithIdentifier确实存在问题,那么最好使用Xcode工具进行检查。在similator和设备(iPhone5iOS8)上都存在滞后,但正如我在第一次从上到下滚动时所说的那样。完全滚动后,它开始平滑滚动。是的,我签入了instruments,问题似乎出在dequeueReusableCellWithIdentifier。您应该在UITableView实例中通过-[dequeueReusableCellWithIdentifier:(NSString*)identifier]注册cell xib。您可能需要重写自定义单元格类中的-[prepareForReuse]。因此,单元实例将被重用。减少单元格实例数将提高速度。