gpt4 book ai didi

ios - 重新启动应用程序 swift 4 时,UserDefaults 有时不保留保存的值

转载 作者:行者123 更新时间:2023-11-30 11:14:09 24 4
gpt4 key购买 nike

我正在保存 Storyboard名称和当前的 View Controller ,以便当用户在主屏幕上点击“恢复”(HomeScreenVC 中的 resumeButtonWasPressed)时,他们可以立即返回到之前查看的 View 。每次我在类中设置值后打印这些值时,都会打印出正确的值,例如“Chapter1”“Page2”。然而,当用户按主屏幕上的“恢复”时,只有一定比例的时间会进入正确的 View 。要保存的正确值在类本身中打印出来,但是当我从 HomeScreenVC 中的 UserDefaults 检索值时,有时会打印出错误的 Storyboard 和 viewController 。我的代码如下。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
_ = UserDefaults.standard
_ = ["strength" : 0]
_ = ["intellect" : 0]
_ = ["charisma" : 0]
_ = ["name" : ""]
_ = ["storyBoard" : "Main"]
_ = ["viewController" : "HomeScreenVC"]

// Override point for customization after application launch.
return true
}

以下是我的 HomeScreenVC 代码,删除了非必需内容:

class HomeScreenVC: UIViewController {
let defaults = UserDefaults.standard

@IBAction func resumeButtonWasPressed(_ sender: Any) {
let sb = defaults.string(forKey: "storyBoard")
let vc = defaults.string(forKey: "viewController")
let storyBoard : UIStoryboard = UIStoryboard(name: sb!, bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: vc!)
self.navigationController?.pushViewController(newViewController, animated: true)
}

override func viewDidAppear(_ animated: Bool) {
let sb = defaults.string(forKey: "storyBoard")
let vc = defaults.string(forKey: "viewController")
print(sb!)
print(vc!)
}
}

这是我的 infoScreen VC,删除了非必需品:

class InfoScreenVC: UIViewController {
let defaults = UserDefaults.standard

override func viewDidAppear(_ animated: Bool) {
let storyboard = self.storyboard?.value(forKey: "name")
UserDefaults.standard.set(storyboard, forKey: "storyBoard") // save to user defaults
let newViewController = self.restorationIdentifier
UserDefaults.standard.set(newViewController, forKey: "viewController")
}
}

这是我的 page1VC,删除了非必需品:

class Page1VC: UIViewController {
let defaults = UserDefaults.standard

override func viewDidAppear(_ animated: Bool) {
let storyboard = self.storyboard?.value(forKey: "name")
UserDefaults.standard.set(storyboard, forKey: "storyBoard") // save to user defaults
let newViewController = self.restorationIdentifier
UserDefaults.standard.set(newViewController, forKey: "viewController")
}
}

这是我的 Page2VC,删除了非必需品:

class Page2VC: UIViewController {
let defaults = UserDefaults.standard

override func viewDidAppear(_ animated: Bool) {
let storyboard = self.storyboard?.value(forKey: "name")
UserDefaults.standard.set(storyboard, forKey: "storyBoard") // save to user defaults
let newViewController = self.restorationIdentifier
UserDefaults.standard.set(newViewController, forKey: "viewController")
}
}

最佳答案

尝试将 applicationDidFinishLaunchingWithOptions 中的代码替换为:

let defaults = UserDefaults.standard
defaults.set(0, forKey: "strength")
defaults.set(0, forKey: "intellect")
defaults.set(0, forKey: "charisma")
defaults.set("", forKey: "name")
defaults.set("Main", forKey: "storyBoard")
defaults.set("HomeScreenVC", forKey: "viewController")

// Override point for customization after application launch.
return true

编辑

此外,您还应该检查 applicationDidFinishLaunchingWithOptions,如果 UserDefaults 键已设置,并且仅在此时未设置时才设置它们。例如:

let defaults = UserDefaults.standard
if defaults.object(forKey: "storyBoard") == nil { // you could use any other key that you use in the app
defaults.set(0, forKey: "strength")
defaults.set(0, forKey: "intellect")
defaults.set(0, forKey: "charisma")
defaults.set("", forKey: "name")
defaults.set("Main", forKey: "storyBoard")
defaults.set("HomeScreenVC", forKey: "viewController")
}

否则它们会在每次应用启动时被覆盖。

关于ios - 重新启动应用程序 swift 4 时,UserDefaults 有时不保留保存的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51904374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com