图表/ Swift 3.0 - 致命错误:索引超出范围

ckr*_*der 2 charts linechart fatal-error ios swift

最近我将https://github.com/danielgindi/Charts添加到我的项目中,我有一个时间范围(1D,3M,1Y,5Y)的segmentControl来执行网络调用并从Yahoo获取数据.

首先,我必须为x轴的String值添加一个方法,其中包含以下内容:

class XAxisStringValueFormatter: NSObject, IAxisValueFormatter {
    private var sValues: [String] = []
    init(values: [String]) {
        sValues = values
    }
    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        return sValues[Int(value)]
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的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)")
        })
    }
Run Code Online (Sandbox Code Playgroud)

这是我的创建Line ChartView:

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  
    }
Run Code Online (Sandbox Code Playgroud)

当我从"3M"移动到"1Y"时,我有一个致命错误 - 索引超出范围.我检查了xValues计数以匹配每个时间范围的yValues.似乎错误到达了xAxisStringValueFormatter,其中yValues计数与xValues不匹配.对我来说似乎很奇怪.任何人都知道我做错了什么?

小智 7

折线图超出折线图或条形图.读数为1.请在IAxisValueFormatter协议中进行以下更改.

func stringForValue(_ value: Double, axis: AxisBase?) -> String {      
    return myArr[Int(value) % myArr.count]
}
Run Code Online (Sandbox Code Playgroud)