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:
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.
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
@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 ")' –
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