从阵列中提取多个数据时如何使用iOS图表?

从阵列中提取多个数据时如何使用iOS图表?,ios,swift,charts,ios-charts,Ios,Swift,Charts,Ios Charts,在过去的几天里,我一直在学习使用iOS图表,并且在处理从API调用的“单个”数据时成功地使它们工作 但是,我现在被卡住了,因为我想从一个数组中提取多个数据 我的目标是根据以下数组中每个用户名的连胜记录创建条形图: ["leagueStats": { winningStreak = ( { id = 2; "user_name" = Dicky; "winning_streak" = 5; },

在过去的几天里,我一直在学习使用iOS图表,并且在处理从API调用的“单个”数据时成功地使它们工作

但是,我现在被卡住了,因为我想从一个数组中提取多个数据

我的目标是根据以下数组中每个
用户名的
连胜记录
创建条形图:

["leagueStats": {
winningStreak =     (
            {
        id = 2;
        "user_name" = Dicky;
        "winning_streak" = 5;
    },
            {
        id = 6;
        "user_name" = G;
        "winning_streak" = 2;
    },
            {
        id = 5;
        "user_name" = Sultan;
        "winning_streak" = 0;
    }
);
}
]
这是我检索API的代码:

这就是我需要帮助的地方-我需要生成某种循环吗? 在提供的答案中,图形中显示的用户数量是预先编程的。

使用下面的当前代码,它只会选择数组中的第一个对象。如何让它在数组中循环并填充所需的变量?

   if let dict = json?["leagueStats"] as? [String:AnyObject] {

                        // WINNING STREAK

                        if let dataWinStreak = dict["winningStreak"] as? [[String : AnyObject]] {
                            let newdictWinStreak = dataWinStreak.first! // I'm guess this needs to be removed and this section re-structured?

                            let tempWinStreakNumber = newdictWinStreak ["winning_streak"] as? String
                            let tempWinStreakNewNumber = Int(tempWinStreakNumber!)
                            let doubleWinStreak = Double(tempWinStreakNewNumber!)

                            self.winStreak = doubleWinStreak
                            self.winningStreak =  ["Wins"]

                            let games = [self.winStreak]
                            self.setWinStreakChart(dataPoints: self.winningStreak, values: games)

                         }
但是,上面的代码仅从要使用的数组中的第一条记录中提取信息,
5

func setWinStreakChart(dataPoints: [String], values: [Double]){

    let formato:WinningStreakFormatter = WinningStreakFormatter()
    let xaxis:XAxis = XAxis()

    winningStreakBarChart.noDataText = "you need to provide some data for the chart."

    var dataEntries: [BarChartDataEntry] = Array()

    for i in 0..<dataPoints.count {
        let dataEntry = BarChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(dataEntry)
        formato.stringForValue (Double(i), axis: xaxis)
    }

    xaxis.valueFormatter = formato
    winningStreakBarChart.xAxis.valueFormatter = xaxis.valueFormatter

    let chartDataSet = BarChartDataSet(values: dataEntries, label: "Games Played")
    let chartData = BarChartData(dataSets: [chartDataSet])

    chartData.addDataSet(chartDataSet)
    winningStreakBarChart.data = chartData

    winningStreakBarChart.xAxis.granularityEnabled = true
    winningStreakBarChart.xAxis.granularity = 1.0

    self.winningStreakBarChart.xAxis.labelPosition = XAxis.LabelPosition.bottom

}
我希望能够生成3个不同的列,
Dicky
G
Sultan
,相应的值为
5
2
,和
0

这是我显示条形图的代码-当前仅显示1列,显示
5

func setWinStreakChart(dataPoints: [String], values: [Double]){

    let formato:WinningStreakFormatter = WinningStreakFormatter()
    let xaxis:XAxis = XAxis()

    winningStreakBarChart.noDataText = "you need to provide some data for the chart."

    var dataEntries: [BarChartDataEntry] = Array()

    for i in 0..<dataPoints.count {
        let dataEntry = BarChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(dataEntry)
        formato.stringForValue (Double(i), axis: xaxis)
    }

    xaxis.valueFormatter = formato
    winningStreakBarChart.xAxis.valueFormatter = xaxis.valueFormatter

    let chartDataSet = BarChartDataSet(values: dataEntries, label: "Games Played")
    let chartData = BarChartData(dataSets: [chartDataSet])

    chartData.addDataSet(chartDataSet)
    winningStreakBarChart.data = chartData

    winningStreakBarChart.xAxis.granularityEnabled = true
    winningStreakBarChart.xAxis.granularity = 1.0

    self.winningStreakBarChart.xAxis.labelPosition = XAxis.LabelPosition.bottom

}
func setWinStreakChart(数据点:[字符串],值:[双精度]){
let formato:WinningStreakFormatter=WinningStreakFormatter()
设xaxis:xaxis=xaxis()
WinningStreamBarChart.noDataText=“您需要为图表提供一些数据。”
var dataEntries:[BarChartDataEntry]=Array()

对于0中的i..
WinningStreakFormatter
类用于格式化xAxis标签,这里我使用了一种从图表对象重用数据的方法,因为
WinningStreakFormatter
对图表视图的引用较弱。因此,使用这种方法,我们可以让图表视图保存数据,而不是在th
WinningStreamFormatter

import Foundation
import Charts

class WinningStreakFormatter: NSObject, IAxisValueFormatter {

    weak var _chartView : BarChartView!

    init(chartView : BarChartView) {
        self._chartView = chartView
    }

    public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        let barChartData : IChartDataSet = (self._chartView.barData?.dataSets.first)!
        let barChartDataEntry : ChartDataEntry = barChartData.entryForIndex(Int(value))!
        return barChartDataEntry.data as! String
    }
}
参考下面的代码以准备建议的图表,在下面的代码中,chartView基本上是
BarChartView
type实例变量。此外,我使用了与API中相同的数据结构,您可以简单地用解析的数据结构替换数据点

    self.chartView.drawBarShadowEnabled = false
    self.chartView.drawValueAboveBarEnabled = true
    self.chartView.chartDescription?.enabled = false

    let  xAxis : XAxis = self.chartView.xAxis;
    xAxis.labelFont = UIFont(name: "HelveticaNeue-Light", size: 10.0)! 
    xAxis.labelTextColor = UIColor.black
    xAxis.drawAxisLineEnabled = false
    xAxis.drawGridLinesEnabled = true
    xAxis.granularity = 1;
    xAxis.labelPosition = .bottom
    xAxis.valueFormatter = WinningStreakFormatter(chartView: self.chartView)

    let yAxisLeft : YAxis = self.chartView.leftAxis
    yAxisLeft.axisMinimum = 0.0

    let yAxisRight : YAxis = self.chartView.rightAxis
    yAxisRight.axisMinimum = 0.0

    let l : Legend = self.chartView.legend;
    l.horizontalAlignment = Legend.HorizontalAlignment.left
    l.verticalAlignment = Legend.VerticalAlignment.bottom
    l.orientation = Legend.Orientation.horizontal
    l.drawInside = false
    l.form = Legend.Form.square
    l.formSize = 9.0
    l.font = UIFont(name: "HelveticaNeue-Light", size: 11.0)!
    l.xEntrySpace = 4.0

    //Data Structure built for each user for winning streak, you can use your parsing logic to prepare the same
    let winningStreakDM1 : [String : Any] = [
        "id" : 2,
        "user_name" : "Dicky",
        "winning_streak" : 5
    ]

    let winningStreakDM2 : [String : Any] = [
        "id" : 6,
        "user_name" : "G",
        "winning_streak" : 2
    ]

    let winningStreakDM3 : [String : Any] = [
        "id" : 5,
        "user_name" : "Sultan",
        "winning_streak" : 0
    ]


    //Array of the each user winning streak dictionary.
    let dataPoints = [winningStreakDM1, winningStreakDM2, winningStreakDM3]

    var values = [BarChartDataEntry]()

    for i in 0..<dataPoints.count {
        let xValue = Double(i)
        let yValue = Double(dataPoints[i]["winning_streak"] as! Int)

        let barChartDataEntry = BarChartDataEntry(x: xValue, y: yValue, data: dataPoints[i]["user_name"] as AnyObject)
        values.append(barChartDataEntry)
    }

    let barChartDataSet = BarChartDataSet(values: values, label: "Winning Streak")
    barChartDataSet.colors = ChartColorTemplates.material()

    let barChartData = BarChartData(dataSet: barChartDataSet)
    barChartData.setValueFont(UIFont.systemFont(ofSize: 12.0))
    self.chartView.data = barChartData
self.chartView.trablershadowEnabled=false
self.chartView.DrawValueUpperBarEnabled=true
self.chartView.chartDescription?.enabled=false
让xAxis:xAxis=self.chartView.xAxis;
xAxis.labelFont=UIFont(名称:“HelveticaNeue灯”,大小:10.0)!
xAxis.labelTextColor=UIColor.black
xAxis.drawAxisLineEnabled=false
xAxis.drawGridLinesEnabled=true
xAxis.granularity=1;
xAxis.labelPosition=.bottom
xAxis.valueFormatter=WinningStreamFormatter(图表视图:self.chartView)
让yaxisleet:YAxis=self.chartView.leftAxis
yAxisLeft.axisMinimum=0.0
让yAxisRight:YAxis=self.chartView.rightAxis
yAxisRight.axisMinimum=0.0
让l:Legend=self.chartView.Legend;
l、 horizontalAlignment=Legend.horizontalAlignment.left
l、 垂直对齐=图例.verticalAlignment.bottom
l、 方向=图例。方向。水平
l、 drawInside=false
l、 form=Legend.form.square
l、 formSize=9.0
l、 font=UIFont(名称:“HelveticaNeue灯”,大小:11.0)!
l、 xEntrySpace=4.0
//为每个用户构建的数据结构,您可以使用解析逻辑来准备相同的数据结构
让WinningStreamM1:[字符串:任意]=[
“id”:2,
“用户名”:“迪克”,
“连胜”:5
]
让WinningStreamM2:[字符串:任意]=[
“id”:6,
“用户名”:“G”,
“连胜”:2
]
让WinningStreamM3:[字符串:任意]=[
“id”:5,
“用户名”:“苏丹”,
“连胜”:0
]
//每个用户连胜字典的数组。
让数据点=[winningStreakDM1,winningStreakDM2,winningStreakDM3]
var值=[BarChartDataEntry]()

感谢Prakash-我就快到了:)我的最后一个障碍是winningStreakDM的答案是预先编程的(即3个用户)。我如何循环遍历数组以填充WinningStreamKDM?在我上面的代码中,它只从数组中取出第一个对象,我不知道如何循环遍历以实现我的目标。我已根据这一点更新了问题。Thanks@RDowns您必须遍历winningStreak的数组并准备winningStreakDM或您可以简单地将for循环中的
dataPoints
替换为
winningStreak
数组,以准备
BarChartDataEntry
对象。我需要创建结构和平面图来完成此操作吗?还是我现在走错了路?@RDowns
dict[“winningStreak”]
基本上是数组,所以让dataPoints=dict[“winningStreak”]
完全满足您的要求。