swift:重新加载视图以在图表中显示新数据

Posted

技术标签:

【中文标题】swift:重新加载视图以在图表中显示新数据【英文标题】:swift: reload view for displaying new data in chart 【发布时间】:2017-01-06 17:46:51 【问题描述】:

我正在使用图表框架“图表”,但它没有重新加载包含新数据的图表的功能。它只能在加载 viewController 时显示一次图表。但我想从表格中选择重新加载视图/图表。 (该表在其他视图控制器中)

在我的例子中,我有一个 ViewController,里面有一个视图 和数据在两个数组中:x 和 y

func setChartData(x: [Double], y: [Double])

我试图调用该函数,但它不显示它。 如果从 viewWillAppear() 调用该函数 图表仅显示,如果我切换到另一个视图控制器并切换回来

我该如何解决这个问题

函数中的self.view!.setNeedsDisplay() 不起作用。

我的视图控制器:

override func viewWillAppear(animated: Bool) 
    setChartData(resultID_statistics, y: resultWeight_statistics)



func setChartData(x: [Double], y: [Double])  

    // 1 - creating an array of data entries
    var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
    for var i = 0; i < x.count; i++ 
        yVals1.append(ChartDataEntry(value: y[i], xIndex: i))
    

    // 2 - create a data set with our array
    let set1: LineChartDataSet = LineChartDataSet(yVals: yVals1, label: "First Set")
    set1.axisDependency = .Left // Line will correlate with left axis values
    set1.setColor(UIColor.redColor().colorWithAlphaComponent(0.5)) // our line's opacity is 50%
    set1.setCircleColor(UIColor.redColor()) // our circle will be dark red
    set1.lineWidth = 2.0
    set1.circleRadius = 6.0 // the radius of the node circle
    set1.fillAlpha = 65 / 255.0
    set1.fillColor = UIColor.redColor()
    set1.highlightColor = UIColor.whiteColor()
    set1.drawCircleHoleEnabled = true

    //3 - create an array to store our LineChartDataSets
    var dataSets : [LineChartDataSet] = [LineChartDataSet]()
    dataSets.append(set1)

    //4 - pass our months in for our x-axis label value along with our dataSets
    let data: LineChartData = LineChartData(xVals: x, dataSets: dataSets)
    data.setValueTextColor(UIColor.whiteColor())

    //5 - finally set our data
    self.lineChartView.data = data

    data.notifyDataChanged()
    lineChartView.notifyDataSetChanged()


【问题讨论】:

我尝试将值添加到全局数组中,并从 viewWillAppear 调用函数 override func viewWillAppear(animated: Bool) setChartData(resultID_statistics, y: resultWeight_statistics) 从viewwillappear调用时不重新加载? 不,它没有,只有当我切换到其他 VC 并切换回来 【参考方案1】:

从他们的文档看来,您需要通知数据集的更改:

 // EXAMPLE 1
 // add entries to the "data" object
 exampleData.addEntry(...);
 chart.notifyDataSetChanged(); // let the chart know it's data changed
 chart.invalidate(); // refresh

 // EXAMPLE 2
 // add entries to "dataSet" object
 dataSet.addEntry(...);
 exampleData.notifyDataChanged(); // let the data know a dataSet changed
 chart.notifyDataSetChanged(); // let the chart know it's data changed
 chart.invalidate(); // refresh

欲了解更多信息,请查看他们的wiki。


注意:来自 repo README:

目前不需要 ios/tvOS/OSX 的文档 版本,因为 API 与 android 上的 95% 相同。您可以在此处阅读官方 MPAndroidChart 文档:Wiki

所以当你点击链接并看到“MPAndroidChart”时不要惊慌:)


你也可以试试:

chart.data.notifyDataChanged()
chart.notifyDataSetChanged()

这是取自他们在objective-c中的示例项目:

  LineChartDataSet *set1 = nil;
    if (_chartView.data.dataSetCount > 0)
    
        set1 = (LineChartDataSet *)_chartView.data.dataSets[0];
        set1.values = values;
        [_chartView.data notifyDataChanged];
        [_chartView notifyDataSetChanged];
    

【讨论】:

我不能调用函数invalidate(),因为不存在?我尝试了这个函数但没有结果:lineChartView.notifyDataSetChanged() lineChartView.setNeedsDisplay() 感谢您的尝试,但图表未使用 chart.data.notifyDataChanged() chart.notifyDataSetChanged() 进行更新。 @mostworld77 你能发布更多你的代码实现 self.lineChartView.data.notifyDataChanged() self.lineChartView.notifyDataChanged() 工作不正确? 方法:self.lineChartView.notifyDataChanged()不存在,你的意思是self.lineChartView.notifyDataSetChanged()?也不行

以上是关于swift:重新加载视图以在图表中显示新数据的主要内容,如果未能解决你的问题,请参考以下文章

如何重新加载UIPageViewController以在Swift中重新加载其视图

使用 Highcharts 通过 JSON 重新加载图表数据

Echarts数据重新加载,原数据依然存在图表上

echarts 图表重新加载,原来的数据依然存在图表上

ZingChart 图表插件

swift中的图表数据