我需要在一个非常复杂的表视图中使用几种不同的单元格类型。我使用不同的重用标识符注册了10个不同的单元类xib。问题是,当我第一次滚动表格视图(从上到下)时,我可以看到它有点滞后。然而,在我滚动到底部之后,然后再次滚动到顶部和底部再次顺利运行。问题似乎是dequeueReusableCellWithIdentifier:如果目前没有所需类型的可重用单元,那么在滚动时似乎不能足够快地加载不同的xib文件。这就是为什么第一次滚动是滞后的,但是如果加载了每种类型的足够可重复使用的单元格,那么它就会开始顺利滚动。
有没有办法为UITableView预加载可重用的单元格。因此,例如,我可以加载每个xib类型3次(因此当调用dequeueReusableCellWithIdentifier时,tableview将有30个可重用的单元格已经加载到内存中(每10个单元格类型中有3个)?我需要稍后在应用商店发布应用,以便不允许任何私有API。或者,在这种情况下,您是否还有其他可能的解决方案来改善性能?
答案 0 :(得分:1)
如果您在应用程序中使用故事板,则在将tableView的父视图控制器声明为UITableViewDelegate后,可以在表定义中定义多个单元格类型。
你可能正确的是,XIB的初始加载正在扼杀你。
答案 1 :(得分:1)
我记得,CoreGraphics将首先显示每个单元格并执行一些混合计算,以便在设计标签和视图时显示它们。
通过在InterfaceBuilder中将每个视图(标签,按钮,视图)设置为不透明,可以缓解一些减速。
减少具有alpha!= 1的视图数量。
将背景设置为白色或您正在使用的任何颜色而不是清除。
查看这个人的解释和示例代码,了解他如何以非常动态的tableViews进行滚动。 https://github.com/kevinlawler/fastscrolling
*链接是一个古老的例子,但原则仍然适用于
答案 2 :(得分:1)
使用预加载的单元格创建二级缓存解决了滚动问题。在viewDidLoad上我正在注册nibs(使用registerNib:forCellReuseIdentifier :),然后在viewDidLoad中我正在创建一个可变数组,我使用dequeueReusableCellWithIdentifier:为每个nib加载几个单元格,然后将这些单元格放入我的可变数组中。稍后在cellForRowAtIndexPath中我首先检查我是否在我的可变数组中预加载了所需类型的单元格。如果我有它然后我返回这个单元格并从数组中删除它(我不调用dequeueReusableCellWithIdentifier:在这种情况下)。如果我在缓存中没有它,那么我调用dequeueReusableCellWithIdentifier:来获取单元格。
编辑: 事实证明,滞后的主要原因是我在awakeFromNib中遇到的一些简单的反应性可可绑定。除去这些反应性可可结合后,即使没有任何额外的细胞预加载,一切都开始顺利滚动。
答案 3 :(得分:1)
我使用技巧方式。
1)在实际的前面添加几个零高度单元格。
2)将其排队为你想要的东西。
3)将cell.clipToBounds设置为YES。
现在已经完成了。