【发布时间】:2017-03-12 20:55:00
【问题描述】:
最近我将https://github.com/danielgindi/Charts 添加到我的项目中,其中我有一个时间范围(1D、3M、1Y、5Y)的 segmentControl 来执行网络调用并从 Yahoo 获取数据。
首先,我必须为 x 轴的字符串值添加一个方法,如下所示:
class XAxisStringValueFormatter: NSObject, IAxisValueFormatter {
private var sValues: [String] = []
init(values: [String]) {
sValues = values
}
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
return sValues[Int(value)]
}
}
在我的 LineChartViewController 中,我有一个更改 timeRange 的委托来执行我的 networkCall:
func networkCall(range: ChartRange) {
let symbol = self.symbol
YahooFinanceApiClient.requestEquityChartpoints(symbol: symbol, range: range, onSuccess: { chartpts in
self.createLineChart(range: range, chartpoints: chartpts)
}, onError: { error in
print("Error: \(error.localizedDescription)")
})
}
这是我创建的折线图视图:
func createLineChart(range: ChartRange, chartpoints: [EquityChartpoint]) {
// set data
var xValues: [String] = []
var yValues: [Double] = []
for object in chartpoints {
switch range {
case .OneDay:
let x = Formatters.sharedInstance.stringFromHours(date: object.date)
xValues.append(x!)
case .ThreeMonth, .OneYear, .FiveYear:
let x = Formatters.sharedInstance.stringFromDate(date: object.date)
xValues.append(x!)
}
let y = object.close
yValues.append(y!)
}
// charting
let formatter: XAxisStringValueFormatter = XAxisStringValueFormatter(values: xValues)
let xaxis: XAxis = XAxis()
var dataEntries: [ChartDataEntry] = []
for i in 0..<xValues.count {
let dataEntry = ChartDataEntry(x: Double(i), y: yValues[i], data: xValues as AnyObject)
dataEntries.append(dataEntry)
}
xaxis.valueFormatter = formatter
let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Price")
let data: LineChartData = LineChartData(dataSets: [lineChartDataSet])
self.lineChartView.data = data
self.lineChartView.xAxis.valueFormatter = xaxis.valueFormatter
}
我有一个致命错误 - 当我从“3M”移动到“1Y”时,索引超出范围。我检查了 xValues 计数以匹配每个时间范围的 yValues。似乎错误到达了 xAxisStringValueFormatter,其中 yValues 计数与 xValues 不匹配。对我来说似乎很奇怪。有人知道我做错了什么吗?
【问题讨论】:
-
您找到解决方案了吗?我遇到了完全相同的问题,当我选择一个年份时,它会因索引超出范围而崩溃...
-
@kobe。我将 ChartFormatter 更改为以下内容: open var sValues: [String]! = [] public func stringForValue(_ value: Double, axis: AxisBase?) -> String { return sValues[Int(value) % sValues.count] }
-
另外,在我绘制图表之前确保 xValues 计数等于 yValues 否则放入错误处理方法。
-
当带有要显示的值的数组只有 1 个值时,我总是收到此错误,如果`我有 0 个或多个我没有任何问题。所以对我来说,xAxis 或 yAxis 值似乎不是问题。
标签: ios swift charts fatal-error linechart