繁体   English   中英

在 iOS 中显示多列表格的最有效方法是什么?

[英]What is the most efficient way to display a table with multiple columns in iOS?

我的问题是加载缓慢,滚动速度很快。

我必须显示一个有 10 列的表格:

+-----+------+------+------+------+------+------+------+------+-------+ | Pos | Name | Col3 | Col4 | Col5 | Col6 | Col7 | Col8 | Col9 | Col10 | +-----+------+------+------+------+------+------+------+------+-------+ | 1 | Foo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | Bar | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | Baz | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +-----+------+------+------+------+------+------+------+------+-------+

忽略表头(我不是显示它)我使用UITableView与子类UITableViewCell来表示数据。

我的自定义UITableViewCell有 10 个UILabel子视图,全部添加到它的contentView 每列一个。

我只是在UITableView上的cellForRowAtIndexPath方法中为每个UILabel子视图设置文本值。

在任何时候,屏幕上大约有 14 行。 滚动速度超级快。 我的reuseIdentifier运行良好。

但是,表的初始加载速度明显较慢。 比我使用UITableView其他屏幕慢很多,但那些列的数量要少得多。

我的单元格都设置为opaque (我理解这是默认设置)。

我缺少什么技巧吗? 是否有太多的意见? 我应该采取另一种方法吗? 或者我做得很好,我应该在我的代码中寻找另一个影响加载时间的问题吗?

更新:

我已经运行了仪器,大部分时间(500 毫秒 74.5%)是:

CA::Layer::layout_and_display_if_needed(CA::Transaction*)

更新:

一些人认为我的数据是瓶颈。

我正在使用NSFetchedResultsController

没有计算。 每行的数据直接从相应的实体加载,数据按原样显示。 我不会遍历对象图来从任何其他关系或类似的东西中获取数据。

启用 CoreData SQLDebug ,我可以看到 20 行的总提取执行时间为 0.0014 秒。 我的批量大小设置为 20(比屏幕上可见的略多)以帮助滚动。

滚动速度非常快,所以我认为数据不是这里的问题。

UITableViews 通常用于显示一列数据。 您可以将UICollectionView用于此类事情。

或者,如果您想以一种艰难的方式进行操作,您可以基于 scrollview 实现您自己的表格视图。

但是关于缓慢加载 - 你是从某个网络服务加载数据还是只是简单的演示,所有数据的值都相同?(如果不是 - 尝试这种方式来理解问题)

尝试一次插入一行,假设在您的 viewDidLoad 或 viewwillappear 中,如果您尝试获取所有数据并进行一些计算,则需要时间。 所以我的建议是将一行数据插入它,然后再插入另一行。

您可以尝试自定义 tableview 示例: https : //github.com/Viacheslav-Radchenko/TSUIKit

希望对你有帮助

:)

通过一些更改,我现在将屏幕加载所需的时间减少了一半。

主要的变化是我不再在每一行上使用 10 个不同的子视图(每列一个子视图)。 相反,我现在每个单元格只使用一个子视图。

为了让每个单元格显示数据,我使用了附加到单元格contentView的子类UIView

在那个子类UIViewdrawAtPoint:withAttributes:drawRect方法以使用drawAtPoint:withAttributes: 用不同的文本和位置调用 10 次似乎比定位 10 个不同的UILabel快得多。

StackOverflow 上的这个答案为我指明了正确的方向。

另一个较小的更改是缓存NSClassFromString(myCustomCellName)的结果,每次为表中的每一行调用新的结果(当然除非它被重用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM