我目前正在尝试使用ShinobiCharts,并创建了一个新项目来实现这一目标。
我有一个对象,其自定义初始化程序符合数据源协议:
import ShinobiCharts
import UIKit
class GraphDataSource: NSObject, SChartDatasource {
let data: [Double]
/* Initialisation Methods */
init(data: [Double]) {
self.data = data
}
/* SChartDatasource Methods */
func numberOfSeries(in chart: ShinobiChart) -> Int {
return 1
}
func sChart(_ chart: ShinobiChart, seriesAt index: Int) -> SChartSeries {
return SChartColumnSeries()
}
func sChart(_ chart: ShinobiChart, numberOfDataPointsForSeriesAt seriesIndex: Int) -> Int {
return data.count
}
func sChart(_ chart: ShinobiChart, dataPointAt dataIndex: Int, forSeriesAt seriesIndex: Int) -> SChartData {
return dataPoint(forDataIndex: dataIndex)
}
func dataPoint(forDataIndex dataIndex: Int) -> SChartData {
return SChartDataPoint(xValue: dataIndex, yValue: data[dataIndex])
}
}
然后我将此对象的实例指定为图表的数据源:
let data: [Double] = [0, 0, 0, 0, 0, 0, 10, 10, 30, 50, 100, 100, 80, 40, 30, 50, 40, 70, 20, 10, 10, 10, 0, 0]
...
let dataSource = DayGraphDataSource(data: data)
chart.datasource = dataSource
然而,这导致应用程序崩溃,抱怨-[<classname> numberOfSeriesInSChart:]: unrecognized selector sent to instance
,其中<classname>
可能看似任何类名。我已将其视为__NSCFNumber
和NSISRestrictedToZeroMarkerVariable
等等 - 它似乎会在应用的全新安装时发生变化。
但是,如果我在实际上将图表上的数据源设置为此自定义对象的行上放置断点并打印出我已创建的实例,然后继续执行,该应用程序运行绝对正常。
当我将视图控制器本身作为数据源时,使用完全相同的数据源实现,一切都按预期工作。
答案 0 :(得分:1)
当我将视图控制器本身作为数据源时,使用完全相同的数据源实现,一切都按预期工作。
这似乎表明数据源实例正在尽早解除分配。
该图表仅包含对其数据源的弱引用,因此需要确保其挂起。您是否可以通过将数据源分配给某个属性来检查数据源是否在图表的整个生命周期中保持活动状态,例如
class ViewController: UIViewController {
var dataSource: DayGraphDataSource?
override func viewDidLoad() {
// chart setup code
dataSource = DayGraphDataSource(data: data)
chart.datasource = dataSource
}
}