2017-01-13 43 views
0

我有一个条形图,我试图通过从数组中提取的数据来填充。如何遍历Swift数组并使用iOS Chart中的数据?

我想遍历这个数组,以填充我的图表。

请注意:在这个例子中下面有硬编码用于测试目的3个winningStreakDM变量,但在“现实生活”的数量可能是不同的每个API调用,因为它取决于有多少“用户”是在联赛。

这就是为什么我需要遍历数组并适合构造数据。

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 
    ] 

我的问题是,我不知道如何遍历初始数组来构造我的数据,以使其与上面的代码一起工作。

这是我完整的脚本:

import UIKit 
import Charts 

class CommunityLeagueStatsVC: UIViewController { 


// GRAPHS ********* 

@IBOutlet weak var chartView: BarChartView! 
var values = [BarChartDataEntry]() 

// **************** 
//********CHART VARIABLES**************// 

//WINS LOSSES DRAWS 
var winStreak: Double = 0.0 

@IBOutlet weak var leagueStatsScrollView: UIScrollView! 

var noDefeats: Bool? 
var noWins: Bool? 
var biggestWin: String? 
var biggestWinTeams: String? 

var passedCommunityName: String? 
@IBOutlet weak var communityName: UILabel! 

var playerId2: String? 
var communityId2: String? 
var eMail2: String? 

override func viewDidLoad() { 
    super.viewDidLoad() 


    let winningStreak = ["Wins"] 
    let gamesWon = [winStreak] 
    setWinStreakChart(dataPoints: winningStreak, values: gamesWon) 

    let defaults = UserDefaults.standard 
    let Email = defaults.string(forKey: "userEmail") 
    let playerId = defaults.string(forKey: "playerId") 
    let commsId = defaults.string(forKey: "communityId") 

    self.playerId2 = playerId 
    self.communityId2 = commsId 
    self.eMail2 = Email 


} 

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

    xAxis.valueFormatter = WinningStreakFormatter(chartView: self.chartView) 
    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 
} 


override func viewDidAppear(_ animated: Bool) { 

    let myUrl = URL(string: "http://www.xxx.uk/xxx/getLeagueStats.php") 
    var request = URLRequest(url:myUrl!) 
    request.httpMethod = "POST" 

    let postString = "player_id=\(self.playerId2!)&community_id=\(communityId2!)"; 

    request.httpBody = postString.data(using: String.Encoding.utf8); 
    let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 
     DispatchQueue.main.async 
      { 
       do{ 

        let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 
        print (json!) 

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

          //WINNING STREAK 

         var values = [BarChartDataEntry]() 

         if let dataWinStreak = dict["winningStreak"] as? [[String : Any]] { 
          print ("test one") 
          for (index,item) in dataWinStreak.enumerated() { 
           if let yValue = item["winning_streak"] as? Int, let userName = item["user_name"] as? String { 
            print ("test two") 
            let barChartDataEntry = BarChartDataEntry(x: Double(index), y: Double(yValue), data: userName as AnyObject?) 
            values.append(barChartDataEntry) 

           } 
          } 

          self.setWinStreakChart(dataPoints: ["wins"], values: values) 
         } 
     catch{ 
      print(error) 
       } 
     } 
     } 
    task.resume() 

} 
} 

UPDATE:

这些是我目前收到的错误:

enter image description here

enter image description here enter image description here

随着玩弄和评论包含第一个错误的行,我已经到了这个阶段,它正确地显示了一个带有值的图形,但没有包含每个玩家的用户名的xAxis。

回答

1

您可以通过这种方式创建BarChartDataEntry的数组。

var values = [BarChartDataEntry]() 

if let dataWinStreak = dict["winningStreak"] as? [[String : Any]] { 
    for (index,item) in dataWinStreak.enumerated() { 
     if let yValue = item["winning_streak"] as? Int, let userName = item["user_name"] as? String { 
      let barChartDataEntry = BarChartDataEntry(x: index, y: yValue, data: userName) 
      values.append(barChartDataEntry) 
     } 
    } 
} 
//Now use values array 

编辑:你只需要改变setWinStreakChart功能,因为现在你与动态数据不是静态的一个工作。

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

    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 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 
} 

现在调用此函数后for循环,我们正在创建的BarChartDataEntry阵列。

self.setWinStreakChart(dataPoints: ["wins"], values: values) 
+0

我有一个错误我已经加入这一行'self.setWinStreakChart(数据点:“胜”],值:值)'你的代码的底部,然后调用功能,但它说“无法将类型'[BarChartDataEntry]'的值转换为期望的参数类型'[Double]'。我已经更新了该问题以显示完整的功能以及它的期望。谢谢! – RDowns

+0

@RDowns你为什么要调用这个函数,你的BarChartDataEntry数组被创建,因此你现在不需要调用:'let barChartDataSet = BarChartDataSet(values:values,label:“Winning Streak”)' –

+0

api调用发生在函数来创建图表 - 所以我不需要调用函数来填充检索的数据?我应该向你展示完整的脚本 - 我现在出去了,但当我返回时,将用完整脚本更新问题。谢谢 – RDowns