2016-10-30 3 views
2

최근에 내 프로젝트에 시간 범위 (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와 일치하지 않습니다. 나에게 이상하게 보입니다. 누구나 내가 뭘 잘못했는지 알 수 있니?

+0

해결책을 찾았습니까? 나는 똑같은 문제를 겪고 있는데, 1 년을 선택하면 범위를 벗어나는 인덱스와 충돌합니다 ... – Kobe

+0

@ kobe. ChartFormatter를 다음과 같이 변경했습니다. open var sValues ​​: [String]!반환 값 : [Int (value) % sValues.count] } – ckraider

+0

또한 xValues ​​수와 (와) 일치하는지 확인하십시오. y 값은 오류 처리 방법에 넣은 차트를 그립니다. – ckraider

답변

4

꺾은 선형 차트 또는 막대 차트의 인덱스를 벗어났습니다. 판독 값이 1 일 때 IAxisValueFormatter의 프로토콜에서 다음 변경 사항을 수행하십시오.

func stringForValue(_ value: Double, axis: AxisBase?) -> String {  
    return myArr[Int(value) % myArr.count] 
} 
+0

오버플로 스택에 오신 것을 환영합니다 :-) [대답]을보세요 – JimHawkins

+0

당신은 내 영웅입니다, 남자 !!! – nzackoya

관련 문제