保存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,试图挽救高分当您关闭了,但我似乎无法做到这一点许多不同的时间。如果有人有任何想法如何做到这一点,我真的很感激它大声笑。
答
您还没有解释清楚,你所看到的问题,但我的猜测是,你的高分没有出现跨重新启动被保存的应用程序。
问题是,当您创建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")
欢迎使用stackoverflow!你的问题是关于'UserDefaults',并且你发布了一些代码(好!),但是你发布的代码并不试图使用UserDefaults(坏的...)。你需要告诉我们你写的代码实际上是否试图使用UserDefaults,以及你认为它有什么问题(例如,从编译器得到的确切错误,或者运行时行为的描述以及错误的描述)。 –
好吧,一秒钟我会用我对不起的东西运行它,我只是把它拿出来,所以它更容易阅读。 –
@rob我现在上传了编辑后的代码,并且我还有其他一些评论说我需要做synchronize() –