2017-05-16 1 views
-4
class ThirdViewController: UIViewController { 

var i = 3 

var a: Double = 0 

var fastestScore:Float = 100000000000000.0 

var randomNumberX = Int(arc4random_uniform(375)) 

var randomNumberY = Int(arc4random_uniform(667)) 


@IBOutlet weak var fastestScoreLabel: UILabel! 

@IBOutlet weak var homeButtonLabel: UIButton! 

@IBOutlet weak var finalLabel: UILabel! 

@IBOutlet weak var playAgainButtonLabel: UIButton! 

@IBOutlet weak var circleImage: UIButton! 

@IBOutlet weak var secondTimerLabel: UILabel! 

@IBOutlet weak var counterLabel: UILabel! 

var timerA = Timer() 

var timerB = Timer() 

@IBAction func homeButton(_ sender: Any) { 

    nextPage = false 

} 

@IBAction func playAgainButton(_ sender: Any) { 

    randomNumberX = Int(arc4random_uniform(375)) 

    randomNumberY = Int(arc4random_uniform(667)) 

    homeButtonLabel.isHidden = true 

    counterLabel.text = "3" 

    i = 3 

    timerA = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ThirdViewController.counterFunc), userInfo: nil, repeats: true) 

    a = 0 

    counterLabel.isHidden = false 

    playAgainButtonLabel.isHidden = true 

    circleImage.isHidden = true 

    finalLabel.isHidden = true 

    secondTimerLabel.isHidden = true 

    fastestScoreLabel.isHidden = true 

} 

@IBAction func circleButton(_ sender: Any) { 

    fastestScoreLabel.isHidden = false 

    circleImage.isHidden = true 

    homeButtonLabel.isHidden = false 

    timerB.invalidate() 

    playAgainButtonLabel.isHidden = false 

    var saying = "" 

    if a < 0.2 { 

     saying = "That's actually pretty good \(a) seconds is pretty fast" 

    } else if a >= 0.2 && a <= 0.45 { 

     saying = "\(a) seconds is not really that good" 

    } else { 

     saying = "\(a) seconds? Seriously? Are you even trying?" 

    } 

    finalLabel.text = saying 

    finalLabel.isHidden = false 

    if Float(a) < fastestScore { 

     fastestScore = Float(a) 

     UserDefaults.standard.set(fastestScore, forKey: "Fastest Score") 

     let savedFastestScore = UserDefaults.standard.float(forKey: "Fastest Score") 

     fastestScoreLabel.text = String(savedFastestScore) 

    } 


} 

func secondTimer() { 

    a = a + 0.01 

    secondTimerLabel.text = String(a) 

} 

func counterFunc() { 

    if i > 1 { 

     i -= 1 

     counterLabel.text = String(i) 

    } else { 

     timerB = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ThirdViewController.secondTimer), userInfo: nil, repeats: true) 

     circleImage.isHidden = false 

     self.circleImage.center = CGPoint(x:randomNumberX, y:randomNumberY) 

     counterLabel.isHidden = true 

     timerA.invalidate() 

     secondTimerLabel.isHidden = false 

    } 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 


    fastestScoreLabel.isHidden = true 

    homeButtonLabel.isHidden = true 

    playAgainButtonLabel.isHidden = true 

    circleImage.isHidden = true 

    secondTimerLabel.isHidden = true 

    timerA = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ThirdViewController.counterFunc), userInfo: nil, repeats: true) 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

}sauver un highscore avec UserDefaults à Swift 3

J'ai essayé plusieurs fois à l'aide userDefaults pour essayer de sauver le meilleur score lorsque vous fermez à mais je ne pouvez pas l'faire. Si quelqu'un a une idée sur la façon de le faire, je l'apprécierais vraiment lol.

+4

Bienvenue sur stackoverflow! Votre question concerne 'UserDefaults', et vous avez posté du code (bon!), Mais le code que vous avez posté n'essaie pas d'utiliser' UserDefaults' (mauvais ...). Vous devez nous montrer quel code vous avez écrit qui essaye réellement d'utiliser 'UserDefaults', et ce que vous pensez ne pas être correct (par ex.l'erreur exacte que vous obtenez du compilateur, ou une description du comportement d'exécution et comment c'est incorrect). –

+0

Ok, une seconde je vais le lancer avec ce que j'avais désolé je l'ai juste sorti pour qu'il soit plus facile à lire. –

+0

@rob J'ai téléchargé le code édité maintenant et j'ai eu d'autres commentaires disant que je dois faire synchroniser() –

Répondre

0

Vous avez pas encore clairement expliqué ce problème que vous voyez, mais je pense que votre score ne semble pas être enregistrée à chaque redémarrage de l'application.

Le problème est que vous initialisez fastestScore à 100000000000000.0 lorsque votre ThirdViewController est créé. Vous ne le chargez pas à partir de UserDefaults. Ainsi, même s'il y a un fastestScore enregistré, vous ne le chargez pas au lancement.

Vous devez résoudre ce problème avec deux changements. Tout d'abord, dans votre délégué de l'application, vous devez vous inscrire un score élevé de défaut:

let bestScoreKey = "bestScore" 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(_ application: UIApplication, willFinishLaunchingWithOptions options: [UIApplicationLaunchOptionsKey : Any]?) -> Bool { 
     UserDefaults.standard.register(defaults: [ 
      bestScoreKey: 1_000_000_000.0 
     ]) 
     return true 
    } 

} 

Vous devez également enregistrer d'autres paramètres par défaut là. En second lieu, dans ThirdViewController, vous devez initialiser fastestScore de UserDefaults. Vous pouvez également enregistrer les modifications à UserDefaults en observateur didSet de la propriété:

var fastestScore: Double = UserDefaults.standard.double(forKey: bestScoreKey) { 
     didSet { 
      UserDefaults.standard.set(fastestScore, forKey: bestScoreKey) 
     } 
    } 

Autres conseils:

  • Il n'y a aucune raison de faire un fastestScoreFloat si vos scores sont Double. Il suffit de le sauvegarder en tant que Double.

  • Ne répétez pas les clés de chaîne. Le compilateur n'attraperont pas vos fautes d'orthographe. Mettez la clé dans une constante comme je l'ai fait avec bestScoreKey.

  • Vous pouvez utiliser _ en nombre longs pour les rendre plus lisibles.

  • Insulter votre lecteur est une stratégie de marketing douteuse. Comment vous seriez-vous senti si le premier commentaire sur votre question était "Sérieusement? Essayez-vous même? "

0

Lorsque vous enregistrez des scores élevés, assurez-vous que le score actuel vous est plus grand que le nouveau score.

Supposons que le score actuel est 100

var fastestScore = 100 
var currentScore: Int? 


if currentScore < fastestScore { 
      Userdefaults.standard.set(currentScore, forKey: "Fastest Score") 


} 

Le code ci-dessus ira à la fonction où vous devez enregistrer le score. Peut-être dans votre jeu sur la scène.

Pour récupérer le faible score, faire

var savedFastestScore = UserDefaults.standard.float(forKey: "Fastest Score") 
+1

Vous n'avez pas besoin d'appeler 'synchronize()'. – rmaddy

+0

@rmaddy J'ai vu beaucoup d'exemples qui me disent d'utiliser synchronize(). Que fait-il réellement et pourquoi n'en ai-je pas besoin? –

+0

voir http://stackoverflow.com/questions/40808072/when-and-why-should-you-use-nsuserdefaultss-synchronize-method – rmaddy