我想使用 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
}
}
这个模型使您可以拥有同一项目的多个集合,并按集合分隔所有数据。 目前我正在使用 core data 来保存所有数据,但它几乎是一样的:)
关于iOS Charts(danielgindi) - 如何在每次迭代中更新图表数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57861198/