최근에 내 프로젝트에 시간 범위 (1D, 3M, 1Y, 5Y)가있는 segmentControl을 사용하여 네트워크 호출을 수행하고 Yahoo에서 데이터를 가져옵니다.차트/스위프트 3.0 - 치명적인 오류 : 인덱스가 범위를 벗어났습니다.
첫째, 나는 다음과 x 축에 대한 내 문자열 값 방법을 추가했다 : 내 LineChartViewController에서
class XAxisStringValueFormatter: NSObject, IAxisValueFormatter {
private var sValues: [String] = []
init(values: [String]) {
sValues = values
}
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
return sValues[Int(value)]
}
}
, 내 networkCall을 수행 할 timeRange의 변화에 대한 위임이 있습니다
나는 치명적이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
}
: 여기
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)")
})
}
내 생성 라인 ChartView입니다 오류 - "3M"에서 "1Y"로 이동했을 때 색인이 범위를 벗어났습니다. 각 시간 범위에 대해 yValues와 일치하는 xValues 수를 확인했습니다. 오류가 xAxisStringValueFormatter에 도착한 것으로 보입니다. 여기서 yValues 개수는 xValues와 일치하지 않습니다. 나에게 이상하게 보입니다. 누구나 내가 뭘 잘못했는지 알 수 있니?
해결책을 찾았습니까? 나는 똑같은 문제를 겪고 있는데, 1 년을 선택하면 범위를 벗어나는 인덱스와 충돌합니다 ... – Kobe
@ kobe. ChartFormatter를 다음과 같이 변경했습니다. open var sValues : [String]!반환 값 : [Int (value) % sValues.count] } – ckraider
또한 xValues 수와 (와) 일치하는지 확인하십시오. y 값은 오류 처리 방법에 넣은 차트를 그립니다. – ckraider