当我试图加载我的高分并看看我刚得到的分数是否更大时,我遇到了一些问题。首先,它似乎是添加了一些先前的分数,使得高分更大。此外,如果我得到的分数是一个大于高分的负数,那么它只会成为新的高分。这是我的高分视图代码:
import UIKit
class HighScore: ViewController {
@IBOutlet weak var HighscoreLabel: UILabel!
@IBOutlet weak var Scorelabel: UILabel!
@IBOutlet weak var NewHighscoreLabel: UILabel!
override func viewDidLoad() {
let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
var score = defaults.valueForKey("Score") as? String
Score = score?.stringByTrimmingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).toInt() ?? 0
Scorelabel.text = score
let SecondDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
var highscore = SecondDefaults.valueForKey("Highscore") as? String
Highscore = highscore?.stringByTrimmingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).toInt() ?? 0
HighscoreLabel.text = highscore
if Score < 0 {
NewHighscoreLabel.text = ""
}
else if Score > Highscore {
Highscore = 0
Highscore += Score
var HighscoreString:String = String(format: "Highscore:%i", Highscore)
let SecondDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
SecondDefaults.setObject(HighscoreString, forKey: "Highscore")
SecondDefaults.synchronize()
HighscoreLabel.text = highscore
NewHighscoreLabel.text = "New Highscore!"
}
}
}
以下是我在实际游戏页面上得分的保存代码:
var ScoreString:String = String(format: "Score:%i", Score)
ScoreLabel.text = (string: ScoreString)
let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(ScoreString, forKey: "Score")
defaults.synchronize()
答案 0 :(得分:0)
首先,您的代码中存在一些问题:无需创建SecondDefaults
变量。它总是与默认数据库相同的单例,因此您可以继续使用第一个变量defaults
。
按照惯例,变量以小写字母开头。使用大写字母ivars非常容易混淆,因为它们看起来像是类名。
逻辑不太清楚,因为您要从viewDidLoad
中的用户默认值中检索值,然后比较它们并重新设置一些值。这似乎不符合逻辑。用户默认条目在您阅读时应该按顺序排列 - 您只应在评估新分数时调整它们。
还有其他各种不合逻辑的行,例如
highscore = 0
highscore += score
完全等同于
highscore = score
回到你的问题:你不应该把你的高分保存为字符串。毫不奇怪,你遇到各种各样的问题,因为你必须编码和解码这些字符串。相反,将您的分数存储为数字 - 您只需使用它们而无需解析字符串。
您得到的错误可能是因为您在其中一个默认条目中没有值。您应该在应用程序启动时初始化变量,以确保它们在那里。执行此操作的最佳方法是registerDefaults
API。
let seedData = ["Score" : 0, "Highscore" : 0]
defaults.registerDefaults(seedData)
只有当这些键不存在时,才会将它们初始化为0。
其余的很容易:
let score = defaults.integerForKey("Score")!
scoreLabel.text = "\(score)"
let highscore = defaults.integerForKey("Highscore")!
highscore.text = "\(highscore)"
newHighscoreLabel.text = ""
请注意,您可以强制打开!
,因为您知道变量已初始化。如上所述,从用户默认值中读取分数没有任何意义。您更有可能显示分数屏幕并获得新分数值。因此
defaults.setInteger(score, forKey: "Score")
let highscore = defaults.integerForKey("Highscore")!
if score > highscore {
defaults.setInteger(score, forKey: "Highscore")
newHighscoreLabel.text = "New Highscore!"
}