我想使用例如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
}
}
这是一个模型,使您可以具有多个项目集,并且所有数据都按组分开。
目前,我正在使用核心数据保存所有数据,但几乎是相同的:)