【问题标题】:IOS Charts line chart view Double value cannot be converted to Int because it is either infiniteIOS Charts折线图视图Double值无法转换为Int,因为它要么是无限的
【发布时间】:2018-04-20 11:28:26
【问题描述】:

我一直在为我的应用程序使用 IOS 图表库。我有包含折线图、饼图和条形图的表格视图单元格。我第一次进入应用程序时,显示图表没有问题,但是当我捏放大折线图视图时,我在 AxisRendererBase 类中出现以下错误。 Fatal error: Double value cannot be converted to Int because it is either infinite or NaN。如果我禁用捏缩放它工作正常。我不明白这个问题,我的 configureCell 方法如下。

func configureLineChart(xTitle:IndexAxisValueFormatter, index:Int) {
    lineChartView.data?.setDrawValues(false)
    lineChartView.doubleTapToZoomEnabled = false
    lineChartView.chartDescription?.enabled = false
    lineChartView.animate(xAxisDuration: 1)
    lineChartView.xAxis.labelPosition = .bottom
    lineChartView.xAxis.drawGridLinesEnabled = false
    lineChartView.xAxis.labelRotationAngle = 45
    lineChartView.xAxis.labelFont = UIFont(name: "HelveticaNeue-Light", size: 8.0)!
    lineChartView.xAxis.valueFormatter = xTitle
    lineChartView.xAxis.labelCount = index
    lineChartView.xAxis.spaceMin = 0.5
    lineChartView.xAxis.spaceMax = 0.5
    lineChartView.xAxis.granularityEnabled = true
    lineChartView.xAxis.granularity = 1
    lineChartView.rightAxis.enabled = false
    //lineChartView.setScaleEnabled(false)
    lineChartView.notifyDataSetChanged()
    lineChartView.pinchZoomEnabled = true
}

当我尝试调试时,我的 lldb 中有以下图像。

我在 StackOverFlow 上搜索并尝试了其他答案。但是,我尝试过的没有奏效。可能是什么原因,我该如何解决?

编辑:在我的 cellForRowAt 方法中

    let cell = grafikTableView.dequeueReusableCell(withIdentifier: "chartCell") as? ChartsCell

    cell?.lineChartView.data = MainGrafikVC.lineChartDataArray[indexPath.row]
    cell?.barChartView.data = MainGrafikVC.barChartDataArray[indexPath.row]        
    cell?.barChartView.isHidden = false
    cell?.lineChartView.isHidden = false

    if MainGrafikVC.barChartDataArray[indexPath.row].dataSetCount != 0 {
cell?.configureBarChart(xTitle: MainGrafikVC.xTitleArray[indexPath.row], index: MainGrafikVC.barChartDataArray[indexPath.row].getDataSetByIndex(0).entryCount, chartData: MainGrafikVC.barChartDataArray[indexPath.row], chartType: Servisler.servisListesi[MainGrafikVC.indexler[indexPath.row]].chartType)
cell?.lineChartView.isHidden = true
    }
    if MainGrafikVC.lineChartDataArray[indexPath.row].dataSetCount != 0 {
    cell?.configureLineChart(xTitle:MainGrafikVC.xTitleArray[indexPath.row] , index: MainGrafikVC.lineChartDataArray[indexPath.row].getDataSetByIndex(0).entryCount)
    cell?.barChartView.isHidden = true
    }

当用户想要将图表添加到我的主表视图时,以下代码有效。

if (Servisler.servisListesi[MainGrafikVC.indexler[MainGrafikVC.listIndex]].chartType == "line") {
    self.createLineChart()
}

if (Servisler.servisListesi[MainGrafikVC.indexler[MainGrafikVC.listIndex]].chartType == "bar" || Servisler.servisListesi[MainGrafikVC.indexler[MainGrafikVC.listIndex]].chartType == "clustered") {
    self.createBarChart()
}

在我的 createLineChart 方法中

func createLineChart() {
    let data = LineChartData()        
    var lineChartEntry1 = [ChartDataEntry]()
    for i in 0..<x1.count {
        lineChartEntry1.append(ChartDataEntry(x: Double(i), y: Double(x1[i]) ?? 0.0))
    }
    let line1 = LineChartDataSet(values: lineChartEntry1, label: "1")
    data.addDataSet(line1)        
    if (x2.count > 0) {
        var lineChartEntry2 = [ChartDataEntry]()
        for i in 0..<x2.count {
            lineChartEntry2.append(ChartDataEntry(x: Double(i), y: Double(x2[i]) ?? 0.0))
        }
    let line2 = LineChartDataSet(values: lineChartEntry2, label: "2")
    data.addDataSet(line2)
    }

    if (x3.count > 0) {
        var lineChartEntry3 = [ChartDataEntry]()
        for i in 0..<x3.count {
            lineChartEntry3.append(ChartDataEntry(x: Double(i), y: Double(x3[i]) ?? 0.0))
        }
        let line3 = LineChartDataSet(values: lineChartEntry3, label: "3")
        data.addDataSet(line3)
    }

        MainGrafikVC.lineChartDataArray.append(data)
        MainGrafikVC.barChartDataArray.append(BarChartData())
        MainGrafikVC.xTitleArray.append(IndexAxisValueFormatter(values: xTitle))
}

【问题讨论】:

  • 你的 pod 版本是多少?
  • 在我的 podfile.lock - Charts (3.1.1): - Charts/Core (= 3.1.1) - Charts/Core (3.1.1) @RazibMollick
  • cell?.configureLineChart() 有两个 arg,你是如何从 cellForRowAt 方法调用的?
  • 我写错了我编辑答案的那一行。
  • 你能发布 createLineChart() 代码吗?

标签: ios swift uitableview linechart ios-charts


【解决方案1】:

您的interval 值为NaN(不是数字)。这就是错误的原因。

您需要追踪它的来源。您可以测试Double 以查看它是否为Nan.isNaN

例如:

if interval.isNaN {
    interval = 0
}

如果interval 变为负数,则log10 将返回Nan。使用0log10 也不好。 0 附近的值将产生较大的负值。您应该将所有这些都考虑在内。


您似乎还使用Int 将值截断为整数。使用floor 函数来执行此操作:

替换:

Double(Int(log10(interval)))

与:

floor(log10(interval))

【讨论】:

  • 其实我看不出为什么区间是NaN? x轴是区间值吗?
  • interval 有可能变成负数吗?这将导致log10 返回NaN
  • 试试floor(log10(fabs(interval)))
  • 我试过了,但是也没用。它们在 x 轴或 y 轴上的值的间隔是多少?
  • 我不确定。我没有使用 iOS 图表。您能否发布实际发生崩溃的例程代码?这可能会提供有关使用区间及其值范围的线索。
【解决方案2】:

即使我尝试了这些解决方案,它们都没有为我正常工作。因此,我在 Charts 库的 AxisRendererBase.swift 类中添加了 isNaN 控件。现在,AxisRendererBase 类的第 98 行应该如下所示,

if labelCount == 0 || range <= 0 || range.isInfinite || range.isNaN

【讨论】:

    【解决方案3】:

    只是遇到了同样的问题,没有必要摆弄库中的类,但是如果没有数据可以计算它们,请强制设置您的最小值和最大值。

    如果没有数据可以计算它们,那么它们将是负无穷和正无穷,这会导致崩溃发生。

    对于我的代码,修复如下:

    //If less than two items in line
    //Force min and max to avoid range crash in library
    if doubleValueArray.compactMap({ $0 }).count <= 2 {
        chartView.leftAxis.axisMinimum = 0
        chartView.leftAxis.axisMaximum = 100
    } else {
        chartView.leftAxis.axisMinimum = lineChartData.yMin
        chartView.leftAxis.axisMaximum = lineChartData.yMax
    }
    

    【讨论】:

      【解决方案4】:

      我刚刚通过编辑 AxisRendererBase 类解决了这个问题。 我的错误和你的一样。 它在第 119 行遇到了该错误

      将您的 Double(Int(log10(interval))) 替换为 floor(log10(fabs(interval)))

      错误

      AxisRendererBase.swift
          let intervalMagnitude = pow(10.0, Double(Int(log10(interval)))).roundedToNextSignficant() //error line 
      

      解决了

      AxisRendererBase.swift
            let intervalMagnitude = pow(10.0, floor(log10(fabs(interval)))).roundedToNextSignficant()
      

      ++ 如果它不起作用, 请不要在 records.isEmpty 时设置图表。

      喜欢

      if(!records.isEmpty){
         showChart()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        • 2020-05-03
        相关资源
        最近更新 更多