我从中获得此代码的资源是用Swift 3编写的,并且可以正常工作。我的应用程序是用Swift 4编写的。我认为我可能缺少Swift 4特有的功能,但我不知道它可能是什么。
我有适当的店铺和变量...
@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet weak var highScoreLabel1: UILabel!
var recordData: String!
viewDidLoad
和viewDidAppear
占...
override func viewDidLoad() {
super.viewDidLoad()
let userDefaults = Foundation.UserDefaults.standard
let value = userDefaults.string(forKey: "Record")
recordData = value
}
override func viewWillAppear(_ animated: Bool) {
let userDefaults = Foundation.UserDefaults.standard
let value = userDefaults.string(forKey: "Record")
if (value == nil) {
highScoreLabel1.text = "0"
} else {
highScoreLabel1.text = value
}
}
我创建了一个虽然可以使用的功能...
func high score () {
if gameMode == 0 {
if recordData == nil {
let savedString = scoreLabel.text
let userDefaults = Foundation.UserDefaults.standard
userDefaults.set(savedString, forKey: "Record")
} else {
let score: Int? = Int(scoreLabel.text!)
let record: Int? = Int(recordData)
if score! > record! {
let savedString = scoreLabel.text
let userDefaults = Foundation.UserDefaults.standard
userDefaults.set(savedString, forKey: "Record")
}
}
}
}
答案 0 :(得分:0)
保存时使用以下代码
DispatchQueue.main.async {
userDefaults.set(savedString, forKey: "Record")
}
答案 1 :(得分:0)
高分标签没有更新,因为没有代码。标签仅在viewDidLoad
/ viewWillAppear
中设置(一次)。
我强烈建议将高分另存为Int
。这样就避免了可选内容,并且可以大幅减少代码。
声明recordData
var recordData = 0
删除viewDidLoad
中的代码。在viewWillAppear
中一次加载数据就足够了。
将viewWillAppear
替换为
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// integer(forKey returns 0 if the key is not used yet
highScoreLabel1.text = String(UserDefaults.standard.integer(forKey: "Record"))
}
将高分替换为
func highscore() {
guard gameMode == 0, let score = Int(scoreLabel.text!), score > recordData else { return }
recordData = score
UserDefaults.standard.set(recordData, forKey: "Record")
highScoreLabel1.text = String(recordData)
}