保存UserDefaults高分斯威夫特3

问题描述:

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. 
} 
*/ 

}保存UserDefaults高分斯威夫特3

我曾尝试使用userDefaults,试图挽救高分当您关闭了,但我似乎无法做到这一点许多不同的时间。如果有人有任何想法如何做到这一点,我真的很感激它大声笑。

+4

欢迎使用stackoverflow!你的问题是关于'UserDefaults',并且你发布了一些代码(好!),但是你发布的代码并不试图使用UserDefaults(坏的...)。你需要告诉我们你写的代码实际上是否试图使用UserDefaults,以及你认为它有什么问题(例如,从编译器得到的确切错误,或者运行时行为的描述以及错误的描述)。 –

+0

好吧,一秒钟我会用我对不起的东西运行它,我只是把它拿出来,所以它更容易阅读。 –

+0

@rob我现在上传了编辑后的代码,并且我还有其他一些评论说我需要做synchronize() –

您还没有解释清楚,你所看到的问题,但我的猜测是,你的高分没有出现跨重新启动被保存的应用程序。

问题是,当您创建ThirdViewController时,初始化为fastestScore为100000000000000.0。您不会从UserDefaults加载它。因此,即使存储了fastestScore,也不会在启动时加载它。

你应该修复这两个变化。首先,在您的应用程序委托,要注册一个默认的最高得分:

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 
    } 

} 

你还应该注册任何其他默认设置在那里。

其次,在ThirdViewController中,您应该从UserDefaults初始化fastestScore。您还可以更改保存回UserDefaults在酒店的didSet观察员:

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

其他提示:

  • 没有理由让一个fastestScore如果Float你的分数是Double。只需将它保存为Double即可。

  • 不要重复字符串键。编译器不会发现拼写错误。把钥匙放在像bestScoreKey那样的常数上。

  • 您可以使用长号码_以提高其可读性。

  • 侮辱你的玩家是一个值得怀疑的营销策略。如果您对您的问题的第一条评论是“真的吗?你甚至在尝试吗?“

当您保存高分时,请确保您拥有的当前分数高于新分数。

假定当前高分是100

var fastestScore = 100 
var currentScore: Int? 


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


} 

上面的代码会去哪里,你需要保存高分功能。也许在你的游戏结束后。

要检索的低分,这样做

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

你不需要调用'synchronize()'。 – rmaddy

+0

@rmaddy我见过很多例子,告诉我使用synchronize()。它实际上做了什么,为什么我不需要它? –

+0

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