xcode - 使用 NSuserdefaults 在 Swift 和 Sprite Kit 中设置 HighScore

标签 xcode swift nsuserdefaults

我正在构建一个快速游戏并且需要设置高分,我一直在努力弄清楚如何去做。所以请你告诉我如何搜索这个库,看看是否有已经保存的高分,然后将它与用户的分数进行比较。我试过解决这个问题,但行不通。请帮助并尽可能清楚。给我示例代码将不胜感激。

    if let highscore: AnyObject = NSUserDefaults.valueForKey("highscore") { 
      var savedScore: Int = NSUserDefaults.standardUserDefaults().objectForKey("highScore") as Int
        if ( savedScore < Score) { 
            var highscore = Score
            NSUserDefaults.standardUserDefaults().setObject(highscore, forKey:"highscore")
            NSUserDefaults.standardUserDefaults().synchronize() }
    }
    else { 
        var highscore = Score
        NSUserDefaults.standardUserDefaults().setObject(highscore, forKey:"highscore")
        NSUserDefaults.standardUserDefaults().synchronize()
   }

最佳答案

使用 Single View Application 模板在 Xcode 中创建一个新的 iOS 项目。然后,替换ViewController.swift的内容使用以下代码:

import UIKit

class ViewController: UIViewController {
    
    var generator = [6, 12, 8].generate()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = UIButton(type: .System)
        button.setTitle("Button", forState: .Normal)
        button.addTarget(self, action: "newScore", forControlEvents: .TouchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(button)
        
        // Auto layout code using anchors (requires iOS9+)
        let horizontalConstraint = button.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
        let verticalConstraint = button.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
        NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint])
        
        // Print NSUserDefaults's highscore value when app is launched
        print("highscore:", NSUserDefaults.standardUserDefaults().integerForKey("highscore"))
    }
    
    func newScore() {
        guard let score = generator.next() else { return }
        print("current score:", score)

        //Check if score is higher than NSUserDefaults stored value and change NSUserDefaults stored value if it's true
        if score > NSUserDefaults.standardUserDefaults().integerForKey("highscore") {
            NSUserDefaults.standardUserDefaults().setInteger(score, forKey: "highscore")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
        
        print("highscore:", NSUserDefaults.standardUserDefaults().integerForKey("highscore"))
    }
    
}

在您的 iPhone 或模拟器上构建并运行该项目。 Xcode 控制台将打印 0,这是 NSUserDefaults.standardUserDefaults().integerForKey("highscore") 的当前值.

现在,点击按钮。这将设置 score 的值至 6而且,因为 6 > 0 , NSUserDefaults.standardUserDefaults().integerForKey("highscore")将获得这个新值。

再次点击按钮。这将设置 score 的值至 12 .您将立即在控制台中看到 NSUserDefaults.standardUserDefaults().integerForKey("highscore")获取这个新值。

现在,如果您更改 score 的值至 8通过单击按钮,您将看到 NSUserDefaults.standardUserDefaults().integerForKey("highscore")仍然具有 12 的值(value)因为8 < 12 .

如果您重建项目并重新启动它,您将看到 NSUserDefaults.standardUserDefaults().integerForKey("highscore")是持久的(它的值仍然是 12 并且没有被重置)。因此,NSUserDefaults可以成为存储玩家最高分的完美工具。


额外提示

NSUserDefaults.standardUserDefaults().integerForKey("highscore")总是返回 Int (如果你没有自己设置,它会返回 0 ,而不是 nil )。因此,您不需要/不能使用可选绑定(bind)。如果你真的想处理可选值返回,你会更喜欢 NSUserDefaults.standardUserDefaults().objectForKey("highscore") as? Int .

关于xcode - 使用 NSuserdefaults 在 Swift 和 Sprite Kit 中设置 HighScore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25587299/

相关文章:

ios - 如果我的 UI 测试在其他本地化中不起作用,faSTLane 如何为不同的本地化截屏?

swift - 如何检测 UITableView 中处于选定状态的最后一行?

ios - 基于 UIScrollView 内容 View 高度不增加

XCode 4.2 NSManagedObject 上下文构建失败

swift - Xcode - 调试 View 层次结构

ios - 创建新方案后找不到 Pod?

ios - 如何指定 uicollectionView 背景 View 的最小尺寸?

ios - 在按钮外开始触摸并在拖入按钮边界时触发事件

ios - 如何在 swift 中使用 BLOB 将字节数组 [UInt8] 存储和检索到 sqlite3 数据库中?

ios - NSUserDefaults in swift 用于为 TableView 保存字符串数组