2016-11-02 2 views
0

Ich habe eine Schaltfläche, die eine Punktzahl erhöht, und wenn es die höchste Punktzahl ist, wird diese Nummer als Highscore gespeichert, auch nachdem die App geschlossen und wieder geöffnet wird.Swift 3: Wie speichern Sie eine Highscore programmgesteuert?

Dieser Teil funktioniert gut, aber nachdem ich die App wieder öffnen und auf den Button klicken, wird mein Highscore zurückgesetzt und wird gleich der Punktzahl. Ich denke, das liegt daran, dass ich meine Highscore-Variable anrufe, wenn ich meinen HighscoreDefault aufrufen sollte, aber ich verstehe nicht, wie Sie auf diesen Wert zugreifen ... wenn das sogar das Problem ist.

Wie kann ich verhindern, dass der Highscore nach dem erneuten Öffnen der App auf niedrigere Werte als er selbst wechselt?

import UIKit 

class ViewController: UIViewController { 

    let phrase = "Your Score: " 
    var increasingNum = 0 
    let otherphrase = "High Score: " 
    var highscore = 0 
    var label: UILabel? 
    var otherlabel: UILabel? 
    let HighscoreDefault = UserDefaults.standard 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     let label = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 100, y: 100, width: 200, height: 20)) 
     label.textAlignment = .center 
     label.text = "\(phrase) \(increasingNum)" 
     self.view.addSubview(label) 
     self.label = label 

     let otherlabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 100, y: 200, width: 200, height: 20)) 
     otherlabel.textAlignment = .center 
     otherlabel.text = "\(otherphrase) \(highscore)" 
     self.view.addSubview(otherlabel) 
     self.otherlabel = otherlabel 

     let button = UIButton(frame: CGRect(x: self.view.frame.size.width/2 - 150, y: self.view.frame.size.height/2 - 50, width: 300, height: 100)) 
     button.backgroundColor = UIColor.cyan 
     button.addTarget(self, action: #selector(scoreGoUp), for: .touchUpInside) 
     self.view.addSubview(button) 

     if let highscore = HighscoreDefault.value(forKey: "highscore") { 

      otherlabel.text = "\(otherphrase) \(highscore)" 
     } 
    } 

    func scoreGoUp (sender: UIButton){ 

     increasingNum += 1 
     self.label?.text = "\(phrase) \(increasingNum)" 
     if (increasingNum > highscore){ 

      highscore = increasingNum 
      self.otherlabel?.text = "\(otherphrase) \(highscore)" 
      HighscoreDefault.set(highscore, forKey: "highscore") 
     } 
    } 
} 
+2

Zuallererst nie 'valueForKey' in' UserDefaults' verwenden, außer Sie wissen wirklich was Sie tun. Es gibt eine dedizierte Methode 'integer (forKey:' – vadian

Antwort

0

highscore Standardwert ist 0, so dass für jedes erstes Mal der Aktion if (increasingNum > highscore) genannt sollte immer true sein. Was müssen Sie irgendwo in Ihrem Code tun, um zu vergeben, um Ihre HighscoreDefault.value(forKey: "highscore") as? Int-highscore: half

override func viewDidLoad() { 

    super.viewDidLoad() 

    let label = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 100, y: 100, width: 200, height: 20)) 
    label.textAlignment = .center 
    label.text = "\(phrase) \(increasingNum)" 
    self.view.addSubview(label) 
    self.label = label 

    let otherlabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 100, y: 200, width: 200, height: 20)) 
    otherlabel.textAlignment = .center 
    otherlabel.text = "\(otherphrase) \(highscore)" 
    self.view.addSubview(otherlabel) 
    self.otherlabel = otherlabel 

    let button = UIButton(frame: CGRect(x: self.view.frame.size.width/2 - 150, y: self.view.frame.size.height/2 - 50, width: 300, height: 100)) 
    button.backgroundColor = UIColor.cyan 
    button.addTarget(self, action: #selector(scoreGoUp), for: .touchUpInside) 
    self.view.addSubview(button) 

    if let highscore = HighscoreDefault.value(forKey: "highscore") as? Int { 
     // here is the extra job!! 
     self.highscore = highscore 
     otherlabel.text = "\(otherphrase) \(highscore)" 
    } 
} 

Hope it.

-1

Highscore muss ein Array von int nicht int
Und Sie sollten dieses Array (aufsteigend oder Abnahme) sortieren wenn neue Score> das kleinste Element im Array und array.count> Zählung Ihres Höhe Kern Standard -> Sie ändern dieses Element um neue Punkte. Und speichern Sie sie
wenn array.count < nur newscore zu Array hinzufügen und speichern

+0

Ich denke, dass Sie es einfach überbewertet haben (Nicht abstimmen Ihre BTW) – ColdSteel

+0

keine Notwendigkeit, ein Array zum Speichern von nur 1 Wert (höchste Punktzahl) erstellen –

+0

ok, don vergiss nicht: userDefaults.synchronize() –

1

Statt

if let highscore = HighscoreDefault.value(forKey: "highscore") { 

      otherlabel.text = "\(otherphrase) \(highscore)" 
     } 

diese Zeile im Code hinzufügen in ViewDidLoad

if let highscore = HighscoreDefault.value(forKey: "highscore") { 

     otherlabel.text = "\(otherphrase) \(highscore)" 
     self.highscore = highscore as! Int 
    } 
1

, wenn Sie Ihre App wieder öffnen , UserDefault's vielleicht speichern Sie Ihre HighScore aber Ihr Code hat es nicht zugewiesen ViewController's Highscore-Variable

if let highscore = HighscoreDefault.value(forKey: "highscore") as? Int { 
     self.highscore = highscore 
     otherlabel.text = "\(otherphrase) \(highscore)" 
} 
0

init Ihre Highscores hier:

if let highscoreLast = HighscoreDefault.value(forKey: "highscore") { 

    otherlabel.text = "\(otherphrase) \(highscore)" 
    // you should get your highscore here    
    highscore = highscoreLast 

    } 
2

Meiner Meinung nach der bequemste Weg, highscore zu sparen ist eine berechnete Variable wie folgt umzusetzen:

var highScore: Int { 
    get { 
     return UserDefaults.standard.integer(forKey: "highScore") 
    } 
    set { 
     UserDefaults.standard.set(newValue, forKey: "highScore") 
    } 
} 

So kann man sich nicht die Mühe wird Nachdenken über UserDefaults, nachdem Sie diese Variable in Ihrem Controller oder Singleton haben.

Verwandte Themen