我有一个饼图,显示添加到它的数据它看起来像这样:
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()
}
}
然后图表将开始显示额外值
一个说明性示例:
enter image description hereenter image description here
在第一个屏幕截图中,entries位于函数中,而在第二个屏幕截图中,entries已经位于函数之后
我尝试设置断点并查看for循环,但我仍然不明白为什么每次迭代时数组都会将旧数据添加到新数据中
2条答案
按热度按时间d8tt03nd1#
因为你是从
viewWillAppear
调用setChart
的,所以你会追加数组中的很多项(如果视图在一个会话中出现/消失),你需要适当地清除变量,或者完全覆盖它们。不相关,但是可以大大简化for循环代码:
开始日期:
删除无用的
if
语句:将手动构造的索引范围替换为简单的
Array.indices
:要知道,你甚至不需要指数,你只关心价值观本身:
内联局部变量(其名称不添加任何有用信息):
请注意,这只是一个
map
操作:entries
现在可以是不可变的,并且可以使用类型推断:2lpgd9682#
我将
entries
数组放入一个类中,并在setChart7
函数中清除它