2017-01-13 3 views
0

Ich habe ein Balkendiagramm, das ich versuche, durch Daten aus einem Array zu füllen.Wie man durch Swift-Array iteriert und Daten in iOS Chart verwendet?

Ich versuche, durch dieses Array zu iterieren, um mein Diagramm zu füllen.

Bitte beachten Sie: in diesem Beispiel unten gibt es 3 winningStreakDM Variablen zu Testzwecken fest einprogrammiert, sondern in ‚wirklichen Leben‘ könnte die Anzahl unterschiedlicher jeder API-Aufruf sein, wie es hängt davon ab, wie viele ‚Benutzer‘ in dieser Liga sind .

Aus diesem Grund muss ich durch das Array iterieren und die Daten entsprechend anpassen.

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 
    ] 

Mein Problem ist, dass ich weiß nicht, wie durch die anfängliche Array zu durchlaufen, meine Daten zu strukturieren für sie mit dem obigen Code zu arbeiten.

Das ist mein voller Skript:

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:

Dies sind die Fehler, die ich zur Zeit empfangen:

enter image description here

enter image description here enter image description here

Mit ein bisschen herumspielen und kommentieren die Zeile mit dem ersten Fehler habe ich zu diesem Zeitpunkt, der eine Grafik mit Werten korrekt zeigt, aber keine xAxis enthält die userNames von jedem Spieler.

Antwort

1

Sie können Array von BarChartDataEntry auf diese Weise erstellen.

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 

Edit: Sie müssen nur setWinStreakChart Funktion ändern, weil Sie jetzt mit dynamischen Daten nicht statisch arbeiten.

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 
} 

Und jetzt diese Funktion nach der for-Schleife nennen, wo wir Array von BarChartDataEntry schaffen.

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

Ich habe einen Fehler, dass ich hinzugefügt haben, diese Zeile 'self.setWinStreakChart (datapoints: [„gewinnt“], Werte: Werte)' auf den Boden des Codes, um dann die Funktion aufrufen, aber es sagt " Der Wert vom Typ '[BarChartDataEntry]' kann nicht in den erwarteten Argumenttyp '[Double]' konvertiert werden. Ich habe die Frage aktualisiert, um die volle Funktion und das, was sie erwartet, zu zeigen. Vielen Dank! – RDowns

+0

@Rowns Warum rufen Sie diese Funktion an, wird Ihr Array von BarChartDataEntry erstellt, also müssen Sie jetzt nicht aufrufen: 'let barChartDataSet = BarChartDataSet (Werte: Werte, Label:" Winning Streak ")' –

+0

Der API-Aufruf geschieht außerhalb von die Funktion, um das Diagramm zu erstellen - also muss ich die Funktion nicht aufrufen, um sie mit den abgerufenen Daten zu füllen? Ich sollte dir wahrscheinlich das vollständige Skript zeigen - ich bin im Moment draußen, werde aber die Frage mit dem vollständigen Skript aktualisieren, wenn ich zurückkomme. Danke – RDowns

Verwandte Themen