【问题标题】:Charts / Swift 3.0 - fatal error: Index out of rangeCharts / Swift 3.0 - 致命错误:索引超出范围
【发布时间】: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


【解决方案1】:
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
    let a = ""
    if(myArr.count>0)
    {
        return myArr[Int(value) % myArr.count]
    }
    return a
   
}

【讨论】:

    【解决方案2】:

    折线图或条形图的索引超出范围。当读数为1时,请在IAxisValueFormatter的Protocol中做如下修改。

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

    【讨论】:

    • 欢迎堆栈溢出 :-) 请看How to Answer
    • 它帮助了我!谢谢@Vipul
    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多