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

标签 ios swift uitableview cocoa-touch ios-charts

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

View Controller 的内容如下所示: view controller content

我在 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 之间),绘图似乎变得相当复杂。用户注意到,当他向下滚动时:一旦包含如此复杂图表的单元格要出列,滚动就会卡住一小会儿,直到图表被初始化。那当然很丑!

对于这种情况,如果 View Controller 接收到绘图所需的数据并仅将相应的单元格从中拉出,那么不按需使单元格出队而是预定义它们并将它们保存在数组中是否有意义这个数组什么时候需要?或者有没有办法使图表的初始化异步,以便单元格立即存在,但图表在“准备就绪”时出现?

感谢您的回复!

最佳答案

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

1- 预先计算您的图形并将它们导出为图像。将图像加载到单元格中和从单元格中加载图像将减少性能的降低。

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

希望对您有所帮助!

关于ios - 如何创建具有复杂内容的 UITableViewCells 以保持滚动流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30976450/

相关文章:

ios - Grand Central Dispatch 和单元测试

Swift:有没有办法制作一个使用多个对象的 SKAction 序列?

ios - 内存警告后将 viewDidUnload 发送到已释放的实例

iphone - 如何找到 UIViewController 是在事件还是非事件 iPhone 应用程序中?

ios - 在同一个堆栈 View 中插入几个相同的对象

iOS:找不到嵌入式框架,但仅在*某些*安装中

java - Swift 相当于 Java 中的 Enum.ordinal()

ios - TextView 点按在 iOS 14 上不起作用

cocoa-touch - 我可以以编程方式修改选择的 UITableViewCell 吗?

ios - 在 UITableView 中存储当前位置