iOS Charts(danielgindi) - 如何在每次迭代中更新图表数据?

标签 ios swift charts ios-charts

我想使用 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/

相关文章:

Swift UITextField 图标位置设置

ios - 删除后重新加载应用程序时, TableView 中的核心数据条目会出现

swift - 从 Meteor JSON/Array/Cursor 创建字典数组

javascript - Highcharts,突出显示点,不使用点击事件?

ios - 哪个是在 Swift 中显示不规则形状的更好选择?

javascript - iOS 8 Beta 2 中的 Cordova 地理定位问题

iOS IPA 重新打包/重新签名 App Store 应用程序

javascript - Chart.js 副标题不会显示

c# - 我如何以指数方式表示 c# 图表轴值?

ios - 如何在 iOS 7 设置区域中显示非大写文本 block ?