自定义数据源对象未正确创建
Custom data source object not creating correctly
我目前正在试验 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>
看似任何 class 名称。我将其视为 __NSCFNumber
和 NSISRestrictedToZeroMarkerVariable
等 - 它似乎会随着应用程序的全新安装而改变。
但是,如果我在实际将图表上的数据源设置为该自定义对象的行上放置一个断点并打印出我创建的实例,然后继续执行,应用程序运行得非常好。
当我将视图控制器本身作为数据源并使用完全相同的数据源实现时,一切都按预期工作。
When I had the view controller itself as the data source, with the exact same datasource implementation, everything worked as expected.
这似乎表明数据源实例正在提前释放。
该图表对其数据源的引用很弱,因此需要一些东西来确保它存在。您能否通过将数据源分配给 属性 例如
来检查数据源在图表的整个生命周期中是否保持活动状态
class ViewController: UIViewController {
var dataSource: DayGraphDataSource?
override func viewDidLoad() {
// chart setup code
dataSource = DayGraphDataSource(data: data)
chart.datasource = dataSource
}
}
我目前正在试验 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>
看似任何 class 名称。我将其视为 __NSCFNumber
和 NSISRestrictedToZeroMarkerVariable
等 - 它似乎会随着应用程序的全新安装而改变。
但是,如果我在实际将图表上的数据源设置为该自定义对象的行上放置一个断点并打印出我创建的实例,然后继续执行,应用程序运行得非常好。
当我将视图控制器本身作为数据源并使用完全相同的数据源实现时,一切都按预期工作。
When I had the view controller itself as the data source, with the exact same datasource implementation, everything worked as expected.
这似乎表明数据源实例正在提前释放。
该图表对其数据源的引用很弱,因此需要一些东西来确保它存在。您能否通过将数据源分配给 属性 例如
来检查数据源在图表的整个生命周期中是否保持活动状态class ViewController: UIViewController {
var dataSource: DayGraphDataSource?
override func viewDidLoad() {
// chart setup code
dataSource = DayGraphDataSource(data: data)
chart.datasource = dataSource
}
}