如何创建具有复杂内容的 UITableViewCells 以保持滚动流畅

Posted

技术标签:

【中文标题】如何创建具有复杂内容的 UITableViewCells 以保持滚动流畅【英文标题】:How to create UITableViewCells with complex content in order to keep scrolling fluent 【发布时间】:2015-06-22 09:29:52 【问题描述】:

我正在做一个项目,我有一个表格视图,其中包含许多内容非常复杂的单元格。它通常在不超过两个之间,但在例外情况下,最多可以说是 30 个。这些复杂的单元格中的每一个都包含一个折线图。我为此使用 ios-charts (https://github.com/danielgindi/ios-charts)。

View Controller 的内容如下所示:

我在 viewController 的 cellForRowAtIndexPath 方法中用于将单元格出列的代码如下所示:

var cell = tableView.dequeueReusableCellWithIdentifier("PerfgraphCell", forIndexPath: indexPath) as? UITableViewCell
if cell == nil 
    let nib:Array = NSBundle.mainBundle().loadNibNamed("PerfgraphCell", owner: self, options: nil)
    cell = nib[0] as? FIBPerfgraphCell


cell.setupWithService(serviceObject, andPerfdataDatasourceId: indexPath.row - 1)
return cell!

在单元格的代码中,我有一个方法“setupWithService”,它从已经存在的对象“serviceObject”中提取数据源并初始化图形的绘制,如下所示:

func setupWithService(service: ServiceObjectWithDetails, andPerfdataDatasourceId id: Int) 

    let dataSource = service.perfdataDatasources[id]
    let metadata = service.perfdataMetadataForDatasource(dataSource)

    if metadata != nil 
        if let lineChartData = service.perfdataDatasourcesLineChartData[dataSource] 

            println("starting drawing for \(lineChartData.dataSets[0].yVals.count) values")

            chartView.data = lineChartData
        
    

现在的问题是:根据图表中要绘制的值的数量(100 到 2000 之间),绘图似乎变得相当复杂。用户注意到,当他向下滚动时:一旦包含如此复杂图表的单元格要出列,滚动就会卡住一小会儿,直到图表被初始化。那当然是丑陋的!

对于这种情况,如果视图控制器接收到绘图所需的数据并将相应的单元格拉出这个数组什么时候需要?或者有没有办法使图表的初始化异步,以便单元格立即存在但图表在“准备好”时出现?

感谢您的回复!

【问题讨论】:

【参考方案1】:

在一种或另一种情况下,您尝试做的事情将不可避免地遇到一些严重的性能问题。将所有单元格(及其数据存储到内存中)将很快耗尽应用程序的可用内存。另一方面,正如您现在所经历的那样,出队和重新加载会在某些设备上产生滞后。您最好通过以下方式重新考虑应用程序的架构:

1- 预先计算您的图表并将其导出为图像。将图像加载到单元格中和从单元格中加载出来的性能损失要小得多。

2- 将表格视图变成一个向下钻取菜单,一次只显示一个图表。

希望这会有所帮助!

【讨论】:

谢谢。你的问题把我推向了正确的方向。我仍然不知道如何实现图表的绘制和保存到保存的图像中,但我可能会在这里问另一个问题。

以上是关于如何创建具有复杂内容的 UITableViewCells 以保持滚动流畅的主要内容,如果未能解决你的问题,请参考以下文章

创建具有多个对象/层的视图 [关闭]

Terraform:如何创建具有动态和静态内容的块

如何根据其中的内容创建具有动态高度的集合视图?

xsd 具有混合内容的复杂类型

如何让 Json.NET 为具有复杂值的属性设置 IsSpecified 属性?

如何使用spring webflux在功能性反应java中编写具有多个if else的复杂代码