2015-06-22 13 views
3

我正在研究一个项目,其中有一个表格视图,其中包含大量具有非常复杂内容的单元格。它通常不会超过两个,但在例外情况下 - 可以说 - 其中有30个。这些复杂单元格中的每一个都包含折线图。我正在使用ios-charts(https://github.com/danielgindi/ios-charts)。如何创建具有复杂内容的UITableViewCell以保持滚动流利

这是视图控制器的内容是什么样子: 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之间),绘图似乎变得非常复杂。用户注意到当他向下滚动时:只要包含这样一个复杂图表的单元出队,滚动就卡住了一会儿,直到图表初始化。那当然很丑陋!

对于这种情况,是否有意义的是不按需要使单元出列,但是预定义它们并将它们保存在数组中,一旦图形所需的数据被视图控制器接收并将相应的单元拉出这是什么时候需要的数组?或者是否有办法使图表初始化为异步,以便单元立即出现,但图表何时出现“准备就绪”?

感谢您的回复!

回答

4

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

1-预先计算您的图并将它们导出为图像。将图片载入和关闭单元格的性能会降低很多。

2-将表格视图变为下拉菜单,您一次只能显示一张图。

希望这会有所帮助!

+0

谢谢。你的问题推动我走向正确的方向。我仍然不知道如何将图表保存到保存的图像中,但我可能会在此提出另一个问题。 –

+0

不用担心,欢迎您! –

相关问题