2014-11-20 32 views
1

这是我与总得分视图控制器上的代码:Swift中的NSUserDefaults不会像我目前的代码那样保存我的数据。我的问题是什么?

import UIKit 

var playerName = "" 
var totalScore = 0 
var bestPlayer = "Taipan" 
var highScore = 100 

var myNumber: NSInteger = highScore 
var myName: NSString = bestPlayer 

class StartVC: UIViewController, UITextFieldDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBOutlet weak var lblPlayerName: UILabel! 

    @IBOutlet weak var lblNameScore: UILabel! 

    @IBOutlet weak var txtPlayerName: UITextField! 

    @IBAction func btnPlay(sender: UIButton) { 
     if txtPlayerName.text == "" { 
      lblPlayerName.text = "Please enter your name!" 
     } else { 
      playerName = txtPlayerName.text 
      performSegueWithIdentifier("StartingStatsVC", sender: self) 
     } 
    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     txtPlayerName.resignFirstResponder() 
     return true 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     self.view.endEditing(true) 
    } 

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

    override func viewWillAppear(animated: Bool) { 
     NSUserDefaults.standardUserDefaults().setObject(myNumber, forKey: "fixedHighScore") 
     NSUserDefaults.standardUserDefaults().setObject(myName, forKey: "fixedPlayerName") 
     NSUserDefaults.standardUserDefaults().synchronize() 

     var myscore: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("fixedHighScore") 
     var myplayer: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("fixedPlayerName") 
     NSUserDefaults.standardUserDefaults().synchronize() 

     lblNameScore.text = String(myplayer as NSString) + ": " + String(myscore as NSInteger) 
    } 
} 

这是在不同的视图控制器的代码,其将取代的高分和bestplayer如果分数大于总高:

if totalScore > Int(myNumber as NSNumber) { 
     myNumber = totalScore 
     myName = playerName 
    } 

一切工作,除了保存高分和bestplayer这是使用NSUserDefaults的全部点。请让我知道该更改什么,以便在应用程序关闭后再正确保存时正确保存。

回答

2

问题在于,每当视图首次出现时(在viewWillAppear中),您都将两个用户默认键的对象设置为myNumber和myName。您应该使用registerDefaults,只添加这些初始值,如果没有已经在字典中的值,

override func viewWillAppear(animated: Bool) { 
     let dict = ["fixedHighSCore":myNumber, "fixedPlayerName":myName] 
     NSUserDefaults.standardUserDefaults().registerDefaults(dict) 
     NSUserDefaults.standardUserDefaults().synchronize() 

     var myscore: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("fixedHighScore") 
     var myplayer: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("fixedPlayerName") 
     NSUserDefaults.standardUserDefaults().synchronize() 

     lblNameScore.text = String(myplayer as NSString) + ": " + String(myscore as NSInteger) 
    } 

您还需要将新值添加到用户默认在您的其他控制器(我不不知道你是否已经这样做,但只是没有显示它)。

if totalScore > Int(myNumber as NSNumber) { 
    NSUserDefaults.standardUserDefaults().setObject(totalScore, forKey: "fixedHighScore") 
    NSUserDefaults.standardUserDefaults().setObject(playerName, forKey: "fixedPlayerName") 
    NSUserDefaults.standardUserDefaults().synchronize() 
} 
+0

非常感谢你,最后一个问题。 (我对此很新,所以我很抱歉,如果看起来我在浪费你的时间,我只是在最后一个小时排除理论故障)。如何将新值添加到其他控制器的用户默认值? – 2014-11-20 21:31:07

+0

@EthanScottMiller,我已经更新了我的答案,告诉你如何。如果您还需要从另一个控制器更新myNumber和myName,则需要获取对第一个控制器的引用,或使用协议将新值发回(但这是另一个问题的主题)。 – rdelmar 2014-11-20 21:38:37