开发者社区 问答 正文

如何使用图表(IOS)在X轴上每月显示

stringForValue 里
面我试着打印价值,结果显示:0 2 4 6 8 10 0 1 2 3 4 5 6 7 8 9 10 11 0 2 4 6 8 10 但
为什么它经过了三次,第一次和最后一次通过一次?我每个月都能做些什么?

import UIKit

import Charts

class BarChartViewController: UIViewController {

    var months = [String]()
    var unitsSold = [Double]()

    weak var axisFormatDelegate: IAxisValueFormatter?

    @IBOutlet weak var barChartView: BarChartView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        axisFormatDelegate = self

        months = ["Jan",
                  "Feb",
                  "Mar",
                  "Apr",
                  "May",
                  "Jun",
                  "Jul",
                  "Aug",
                  "Sep",
                  "Oct",
                  "Nov",
                  "Dec"
        ]

        unitsSold = [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0]

        setChart(dataPoints: months, values: unitsSold)


    }

    func setChart(dataPoints: [String], values: [Double]) {
        barChartView.noDataText = "NO DATA"

        var dataEntries = [BarChartDataEntry]()

        for i in 0..<dataPoints.count {
            let dataEntry = BarChartDataEntry(x: Double(i), y: values[i], data: dataPoints)

            dataEntries.append(dataEntry)
        }

        let chartDataSet = BarChartDataSet(entries: dataEntries, label: "Units Sold")
        let chartData = BarChartData(dataSet: chartDataSet)

        barChartView.data = chartData

        barChartView.xAxis.valueFormatter = axisFormatDelegate
    }


}

extension BarChartViewController: IAxisValueFormatter {

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {

        print(Int(value))

        return months[Int(value)]
    }  
}

展开
收起
游客5akardh5cojhg 2019-12-05 22:09:19 436 分享 版权
阿里云 AI 助理回答

从你的描述和代码中,我注意到你提到了stringForValue方法,并且打印出的值似乎与预期不符。这个方法通常用于自定义图表上轴标签的显示文本,看起来你是在尝试使用Charts库来展示柱状图,并且自定义X轴的标签。

首先,关于为什么stringForValue被调用了三次,这可能是因为Charts库在初始化、计算布局以及实际绘制图表时,会多次查询轴的格式化代理(即调用stringForValue)。第一次和最后一次调用可能是为了预计算或者验证布局,而中间那次则是实际绘制时需要的标签。

至于打印结果中的“0 2 4 6 8 10 0 1 2 3 4 5 6 7 8 9 10 11 0 2 4 6 8 10”,这表明value参数在某些循环中没有按预期递增。但是根据你的代码,stringForValue方法内部直接将value转换为整数并索引months数组,理论上不应该出现重复或跳过的月份,除非value的传递有问题。

不过,从你的代码片段来看,直接原因并不明显,因为你在setChart函数中创建BarChartDataEntry时并没有提供错误的索引。一个可能的问题是,如果IAxisValueFormatter接口的实现被其他地方重写了,或者有其他部分的代码影响了value的传递,那可能会导致这种现象。

针对每个月能做什么以解决这个问题,你可以尝试以下几个步骤:

  1. 检查数据绑定: 确认在setChart函数中,dataEntries的创建逻辑是否正确地遍历了values数组,确保每个条目的索引与months数组对应。

  2. 调试:在stringForValue方法内添加更多的调试信息,比如打印出每次调用时的self指针,确认调用该方法的对象是否始终是你期望的那个实例。

  3. 查看外部影响:检查是否有其他代码修改了axisFormatDelegate的指向,或者是否有其他地方也实现了IAxisValueFormatter并被意外调用。

  4. 简化测试:为了隔离问题,可以尝试简化stringForValue方法的内容,仅返回一个固定的字符串,看是否还有异常调用情况,以此来判断问题是否出在方法调用时机上。

  5. 查阅Charts库文档:详细阅读Charts库的官方文档,特别是关于自定义轴格式化的部分,确认是否有特定配置或已知问题可能导致此行为。

希望这些建议能帮助你定位并解决问题。如果问题依旧存在,可能需要更详细的上下文信息来进行进一步分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: