【问题标题】:What is the most efficient way to display a table with multiple columns in iOS?在 iOS 中显示具有多列的表格的最有效方法是什么?
【发布时间】:2014-03-03 08:50:12
【问题描述】:

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

我必须显示一个有 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。每列一个。

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

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

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

我的单元格都设置为opaque(我知道这是默认值)。

我错过了什么技巧吗?浏览量是不是太多了?我应该采取另一种方法吗?还是我做得很好,我应该在我的代码中寻找另一个影响加载时间的问题吗?

更新:

我已经运行 instruments 并且大部分时间(500 毫秒 74.5%)是:

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

更新:

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

我正在使用NSFetchedResultsController

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

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

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

【问题讨论】:

  • 提供一些代码 (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
  • 您是否尝试过使用 Instruments 对其进行分析?
  • 您是从一个简单的数组、CoreData 还是什么获取 cellForRowAtIndexPath 方法中这些标签的内容?我认为你的延迟是因为你如何获得你的价值观。
  • 发布有关如何加载数据的代码。这很可能是速度缓慢的原因。
  • 我添加了一些关于数据加载的信息和一些运行仪器的信息。

标签: ios iphone objective-c uitableview


【解决方案1】:

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

或者,如果你想用scrollview实现你自己的table view。

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

【讨论】:

  • 如果我要实现UICollectionView,我是否能够拥有像UITableView 这样的功能,用户可以点击一行,突出显示等?还是我需要“手动滚动”该功能?
【解决方案2】:

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

【讨论】:

  • 我更新了我的问题,提供了更多关于如何加载表格数据的信息。我不相信这是数据问题。
【解决方案3】:

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

希望对你有帮助,

:)

【讨论】:

    【解决方案4】:

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

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

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

    在那个子类UIView 中,我重写了drawRect 方法以使用drawAtPoint:withAttributes:。使用不同的文本和位置调用 10 次似乎比定位 10 个不同的UILabels 要快得多。

    This answer on StackOverflow 为我指明了正确的方向。

    另一个较小的变化是缓存NSClassFromString(myCustomCellName) 的结果,每次对表中的每一行都将其调用为新的(当然,除非它被重复使用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      相关资源
      最近更新 更多