【问题标题】:iOS Charts(danielgindi) - How to update chart data with each iteration?iOS Charts(danielgindi) - 如何在每次迭代时更新图表数据?
【发布时间】:2019-09-10 15:22:35
【问题描述】:

我想使用例如 iOS 图表 (danielgindi) 实时(和动画)显示排序算法的步骤。 我需要在每次迭代时更新图表,但我找不到这样做的方法。

试过了:

sortingWindow.reloadInputViews()

sortingWindow.data?.notifyDataChanged(); 排序窗口.notifyDataSetChanged();

sortingWindow.animate(xAxisDuration: 1) //sortingWindow.setNeedsDisplay()

@IBOutlet weak var sortingWindow: BarChartView!
var counter = 0
var dataVector = [BarChartDataEntry]()


override func viewDidLoad() {
    super.viewDidLoad()
}
///. this works but. not when it is called in the for loop
func updateSorting( values :[BarChartDataEntry]){

    var dataSet = BarChartDataSet(values: values, label: "")
    var  data = BarChartData(dataSets: [dataSet])
    sortingWindow.data = data
    sortingWindow.notifyDataSetChanged()
}

@IBAction func addNumber(_ sender: Any) {

    let number = Int.random(in: 0 ..< 30)
    counter=counter+1
    var entry = BarChartDataEntry(x: Double(counter), y: Double(number))
    dataVector.append(entry)
    updateSorting(values:dataVector)

}

@IBAction func sort(_ sender: Any) {

    for i in 0...dataVector.count-1{
        for  j in 0...dataVector.count-2{
            if(dataVector[i].y<dataVector[j].y){

                var aux = dataVector[i].y
                dataVector[i].y=dataVector[j].y
                dataVector[j].y=aux
                usleep(10000)//0.01s
                //updateSorting(values:dataVector)


                sortingWindow.reloadInputViews()

                sortingWindow.data?.notifyDataChanged();
                sortingWindow.notifyDataSetChanged();

                 sortingWindow.animate(xAxisDuration: 1)
                //sortingWindow.setNeedsDisplay()

            }
        }

    }

}

}

【问题讨论】:

    标签: ios swift charts ios-charts


    【解决方案1】:

    我遇到了同样的问题,我想出了一种与下面的方法非常相似的方法。 我也尝试了所有更新图表的方法,但都没有奏效,也许有一种简单的处理方法,这只是我的解决方案!

    func updateChart(_ chart: LineChartView) {
    
            var chartsDataSets: [LineChartDataSet] {
                var chartDataSets = [LineChartDataSet]()
                // sets is an array of Sets, please see the model below
                sets.forEach {
                    var charts = [ChartDataEntry]()
                    $0.dataSets!.forEach({
                        let chartEntry = ChartDataEntry(x: Double($0.xValue), y: Double($0.yValue))
                        charts.append(chartEntry)
                    })
                    let set = LineChartDataSet(entries: charts, label: $0.name)
                    setupSet(set, color: $0.color)
    
                    chartDataSets.append(set)
                }
                return chartDataSets
            }
            chart.data = LineChartData(dataSets: chartsDataSets)
            chart.animate(yAxisDuration: 1, easing: .none)
        }
    

    这里有一个模型示例可以帮助您理解。

    class Set {
    
        let name: String
        var dataSets: [DataSet]?
        let color: UIColor
    
        init(name: String, dataSets: [DataSet]?, color: UIColor) {
            self.name = name
            self.dataSets = dataSets
            self.color = color
        }
    }
    
    class DataSet {
    
        let xValue: Int 
        let yValue: Int
        let date: Date?
    
        init(xValue: Int, yValue: Int, date: Date) {
            self.xValue = xValue
            self.yValue = yValue
            self.date = date
        }
    }
    

    这是一个模型,让您可以拥有多组相同的项目,并将所有数据按组分隔。 目前我正在使用核心数据来保存所有数据,但几乎相同:)

    【讨论】:

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