遵循“如何使用 iOS Charts API 在 Swift 中创建漂亮的图表”的困难

ern*_*uce 2 charts ios

日期为 2015 年 6 月 23 日的 AppCoda 教程将指导您完成一个不会将其视图绘制为视图的入门项目。但是,我的项目错误地绘制了示例条形图;在教程中,所有条形都会出现,并正确标记。我把我的项目版本放在这里IOChartsDemo

这就是我的项目中发生的事情

开发环境:

  • macOS 12.5.5,Xcode 8.3.3 (8E3004b)
  • 图表 3.0.2

我下载了教程中指示的入门项目。

教程中的入门项目没有构建,存在api问题。按照教程中的说明并更正错误后,我最终得到了这个(问题行已注释掉):

class BarChartViewController: UIViewController {
@IBOutlet weak var barChartView: BarChartView!

var months: [String]!

override func viewDidLoad() {
    super.viewDidLoad()
    // barChartView.noDataTextDescription = "Just because" type BarChartView doest have noDataTextDescription
    months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

    // setChart(months, values: unitsSold) missing argument label dataPoints: in call
    setChart(dataPoints: months, values: unitsSold)
}

func setChart(dataPoints: [String], values: [Double]) {
    barChartView.noDataText = "You need to provide data for the chart."
    var dataEntries: [BarChartDataEntry] = []

    for i in 0..<dataPoints.count {
        // let dataEntry = BarChartDataEntry(value: values[i], xIndex: i) // argument labeld dont match
        let dataEntry = BarChartDataEntry(x: values[i], y: Double(i), data: dataPoints[i] as AnyObject)

        dataEntries.append(dataEntry)
    }

    let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold")

    // let chartData = BarChartData(xVals: months, dataSet: chartDataSet) cannot invoke initializer BarCharData with arg list of (xVals: [String]!, dataSet: BarCharDataSet
    let chartData    = BarChartData(dataSets: [chartDataSet])

    barChartView.data = chartData   
}
Run Code Online (Sandbox Code Playgroud)

}

在这一点上,当我运行应用程序时,我得到了前面指出的结果。我在通过 Charts api 后修复了这些。我想这个问题是由图表 2.x 到 3.x 的变化引起的。

如果您是图表专家,我恳请您提供帮助。

Rei*_*ian 5

我一直在研究你的问题,首先,你颠倒了yx

修复这个

这一行let dataEntry = BarChartDataEntry(x: values[i], y: Double(i), data: dataPoints[i] as AnyObject)必须被这一行取代let dataEntry = BarChartDataEntry(x: Double(i), y: values[i], data: dataPoints[i] as AnyObject)

然后你必须使用这个IndexAxisValueFormatter类来显示底部的图例,我的意思是月份的名字

添加此行

barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: months)
barChartView.xAxis.labelCount = months.count
barChartView.xAxis.labelPosition = .bottom
Run Code Online (Sandbox Code Playgroud)

这是完整的代码

import UIKit
import Charts

class BarChartViewController: UIViewController {
    @IBOutlet weak var barChartView: BarChartView!

    var months: [String]!

    override func viewDidLoad() {
        super.viewDidLoad()
        // barChartView.noDataTextDescription = "Just because" type BarChartView doest have noDataTextDescription
        months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

        //setChart(months, values: unitsSold) missing argument label dataPoints: in call
        setChart(dataPoints: months, values: unitsSold)
    }

    func setChart(dataPoints: [String], values: [Double]) {
        barChartView.noDataText = "You need to provide data for the chart."
        var dataEntries: [BarChartDataEntry] = []

        for i in 0..<dataPoints.count {
            // let dataEntry = BarChartDataEntry(value: values[i], xIndex: i) // argument labeld dont match
            let dataEntry = BarChartDataEntry(x: Double(i), y: values[i], data: dataPoints[i] as AnyObject)
            dataEntries.append(dataEntry)
        }

        let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold")

        // let chartData = BarChartData(xVals: months, dataSet: chartDataSet) cannot invoke initializer BarCharData with arg list of (xVals: [String]!, dataSet: BarCharDataSet
        let chartData    = BarChartData(dataSets: [chartDataSet])

        barChartView.data = chartData
         //barChartView.xAxis.ent
        barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: months)
        barChartView.xAxis.labelCount = months.count
        barChartView.xAxis.labelPosition = .bottom

    }

}
Run Code Online (Sandbox Code Playgroud)

这就是它的外观,希望这对你有帮助

在此处输入图片说明