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

尝试过:

sortingWindow.reloadInputViews()

sortingWindow.data?.notifyDataChanged();
sortingWindow.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()

            }
        }

    }

}


}

最佳答案

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

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
    }
}


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

09-25 15:27