Swift 3中Charts 3.0.2无法在TableViewCell绘制图表问题
在TableViewCell中用Charts 3.0.2绘制随机图表的解决方案
嘿,我看你在Swift 3(搭配Xcode 8.3和Charts 3.0.2)里,把视图控制器里正常工作的setChart()搬到TableViewCell里就出问题了——这大概率是Cell生命周期和图表配置时机没踩对节奏,给你整理了一套落地的解决方法:
1. 重构TableViewCell的代码逻辑
先把你的ChartTVC代码补全并优化,把图表的配置逻辑完全封装在Cell内部,避免和VC耦合:
import UIKit import Charts class ChartTVC: UITableViewCell { @IBOutlet weak var barChartView: BarChartView! // 月份数组默认给个示例值,也可以后续从VC传入 var months: [String]? = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] override func awakeFromNib() { super.awakeFromNib() // 在这里初始化图表的基础样式,只执行一次 setupBasicChartStyle() } override func prepareForReuse() { super.prepareForReuse() // 复用Cell时必须清空旧数据,否则滚动会出现数据错乱 barChartView.clear() } // 封装图表基础样式设置 private func setupBasicChartStyle() { barChartView.noDataText = "暂无数据" barChartView.chartDescription?.enabled = false barChartView.legend.enabled = true // 配置X轴,把月份标签关联上去 let xAxis = barChartView.xAxis xAxis.labelPosition = .bottom xAxis.valueFormatter = IndexAxisValueFormatter(values: months ?? []) xAxis.granularity = 1 // 确保每个标签只显示一次 } // 对外暴露的方法,供VC传入随机数据 func configureChart(with randomValues: [Double]) { var dataEntries: [BarChartDataEntry] = [] // 生成图表数据条目 for index in 0..<randomValues.count { let entry = BarChartDataEntry(x: Double(index), y: randomValues[index]) dataEntries.append(entry) } // 创建数据集和数据对象 let dataSet = BarChartDataSet(entries: dataEntries, label: "随机数据") dataSet.colors = ChartColorTemplates.vordiplom() // 用内置配色 let chartData = BarChartData(dataSet: dataSet) barChartView.data = chartData // 强制刷新图表 barChartView.notifyDataSetChanged() } }
2. 在视图控制器中正确调用Cell的配置方法
不要在VC里直接操作Cell的图表,而是在tableView(_:cellForRowAt:)里给Cell传入随机数据:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "ChartTVC", for: indexPath) as? ChartTVC else { return UITableViewCell() } // 生成6个0-100的随机数,对应6个月份 let randomValues = (0..<6).map { _ in Double(Int.random(in: 0...100)) } cell.configureChart(with: randomValues) return cell }
3. 必须注意的几个关键点
- Cell复用问题:一定要在
prepareForReuse()里调用barChartView.clear(),否则滚动TableView时,旧的图表数据会和新数据混在一起,出现奇怪的显示bug。 - 配置时机拆分:基础样式(比如X轴位置、无数据提示)放在
awakeFromNib()里只初始化一次,动态数据放在专门的configureChart()方法里,避免重复配置浪费性能。 - IBOutlet检查:确认你的
barChartView已经在XIB/Storyboard里正确关联到Cell的IBOutlet,很多时候图表不显示都是因为这个连接断了。
如果还是不行,再检查一下Pod的版本是否确实是3.0.2,确保和Swift 3、Xcode 8.3完全兼容。
内容的提问来源于stack exchange,提问作者Shunan
相关产品推荐
相关产品推荐

