Charts pod:为什么要将额外的条目添加到图表中?

  • 本文关键字:添加 pod Charts swift
  • 更新时间 :
  • 英文 :


我有一个饼状图,显示添加到其中的数据它看起来像这样:

class HomeViewController: UIViewController {
var pieChart = PieChartView()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
pieChart.delegate = self               
self.setChart()
}

func setChart() {
var entries: [ChartDataEntry] = []

for entry in 0..<(self.cellArr.count) {
if self.cellArr.count > 0 {
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
}
updateSorting(values: entries)
}

func updateSorting(values: [ChartDataEntry]){
let dataSet = PieChartDataSet(entries: values, label: "")
let data = PieChartData(dataSets: [dataSet])

dataSet.colors = ChartColorTemplates.colorful()
pieChart.data = data
pieChart.notifyDataSetChanged()        
}
}

问题出在entries变量中,它位于setChart函数中。我需要在函数外使用它,但如果我把它放在类中-

class HomeViewController: UIViewController {
var pieChart = PieChartView()
var entries: [ChartDataEntry] = [] // <------------ !!!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
pieChart.delegate = self               
self.setChart()
}
}

然后图表将开始显示额外的值

一个说明性示例:

在这里输入图像描述输入图片描述

在第一个屏幕截图中,条目在一个函数中,在第二个屏幕截图中,条目已经在函数后面了

我尝试设置断点并查看for循环,但我仍然不明白为什么每次迭代数组都会将旧数据添加到新数据中

由于您正在从viewWillAppear调用setChart,因此您将在数组中添加许多项(如果视图在单个会话中出现/消失)。您需要适当地清除变量,或者只是完全覆盖它们。


不相关,但是你可以大大简化这个for循环代码:

开始:

func setChart1() {
var entries: [ChartDataEntry] = []

for entry in 0..<(self.cellArr.count) {
if self.cellArr.count > 0 {
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
}
updateSorting(values: entries)
}

删除无用的if语句:

func setChart2() {
var entries: [ChartDataEntry] = []

for entry in 0..<(self.cellArr.count) {
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
updateSorting(values: entries)
}

用简单的Array.indices替换手动构建的索引范围:

func setChart3() {
var entries: [ChartDataEntry] = []

for entry in self.cellArr.indices { // "entry" is a total misnomer. It's not an entry, it's an index that can be used to get an entry
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
updateSorting(values: entries)
}

意识到你甚至不需要索引,你实际上只关心值本身:

func setChart4() {
var entries: [ChartDataEntry] = []

for entry in self.cellArr {
let dataEntry = PieChartDataEntry(value: Double(entry.amount), label: String(entry.type))
entries.append(dataEntry)
}
updateSorting(values: entries)
}

内联局部变量(它的名字没有添加有用的信息):

func setChart5() {
var entries: [ChartDataEntry] = []

for entry in self.cellArr {
entries.append(PieChartDataEntry(value: Double(entry.amount), label: String(entry.type)))
}
updateSorting(values: entries)
}

注意这只是一个map操作:

func setChart6() {
var entries: [ChartDataEntry] = self.cellArr.map { entry in
PieChartDataEntry(value: Double(entry.amount), label: String(entry.type)))
}
updateSorting(values: entries)
}

entries现在可以是不可变的,并且可以使用类型推断:

func setChart7() {
let entries = self.cellArr.map { PieChartDataEntry(value: Double($0.amount), label: String($0.type))) }
updateSorting(values: entries)
}

我将entries的数组放入一个类中,并在setChart7函数中清除它

class HomeViewController: UIViewController {
var pieChart = PieChartView()
var entries: [ChartDataEntry] = []
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setChart()
}
func setChart7() {
entries.removeAll()
let entries = self.cellArr.map { PieChartDataEntry(value: Double($0.amount), label: String($0.type))) }
updateSorting(values: entries)
}
}

最新更新