在 UserDefaults 中保存 UISwitch 状态
Save UISwitch state in UserDefaults
我想用 UserDefaults 保存 UISwitch 标签的状态。我的代码如下所示:
func viewDidAppear() {
mySwitch.setOn(userDefaults.standard.bool(forKey: "mySwitchValue"), animated: true)
}
func viewWillDesappear() {
UserDefaults.standard.set(mySwitch.isOn, forKey: "mySwitchValue")
}
但是在应用程序中,当我离开切换视图并 return 进入时,UISwitch 并不像我打开时那样。
应该是rmaddy刚才指出的问题吧。那样的话就去拼吧。
否则,当视图消失时设置开关状态的值可能不是一个明智的选择。当应用程序进入后台时,其他进程会同时运行,并且在应用程序关闭之前可能不会影响设置默认值。
我通常会在调用此类函数时设置此类值,即在切换操作中。一旦用户更改开关状态,将其保存在 defaults
中,这样当您在 viewDidAppear
时检索它,它就会起作用。
import UIKit
class ViewController: UIViewController {
let userDefaults = UserDefaults.standard
@IBOutlet weak var mySwitch: UISwitch!
@IBAction func switchAction(_ sender: UISwitch) {
userDefaults.set(sender.isOn, forKey: "mySwitchValue")
}
override func viewDidAppear(_ animated: Bool) {
mySwitch.isOn = userDefaults.bool(forKey: "mySwitchValue")
}
}
下面的演示:
这不是对您原始问题的回答,而是对评论中另一个问题的回答。 问题:如果应用程序是第一次启动,如何将UISwitch的默认状态设置为打开?
虽然理想情况下,它应该作为另一个问题提出,因为它是增量的,代码如下:
import UIKit
class ViewController: UIViewController {
let userDefaults = UserDefaults.standard
var firstTimeAppLaunch: Bool {
get {
// Will return false when the key is not set.
return userDefaults.bool(forKey: "firstTimeAppLaunch")
}
set {}
}
@IBOutlet weak var mySwitch: UISwitch!
@IBAction func switchAction(_ sender: UISwitch) {
userDefaults.set(sender.isOn, forKey: "mySwitchValue")
}
override func viewDidLoad() {
super.viewDidLoad()
if !firstTimeAppLaunch {
// This will only be trigger first time the application is launched.
userDefaults.set(true, forKey: "firstTimeAppLaunch")
userDefaults.set(true, forKey: "mySwitchValue")
}
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool) {
mySwitch.isOn = userDefaults.bool(forKey: "mySwitchValue")
}
}
请注意,您可以在 AppDelegate 的函数中执行此操作:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Could add the above code within this as well. Upto you.
return true
}
我想用 UserDefaults 保存 UISwitch 标签的状态。我的代码如下所示:
func viewDidAppear() {
mySwitch.setOn(userDefaults.standard.bool(forKey: "mySwitchValue"), animated: true)
}
func viewWillDesappear() {
UserDefaults.standard.set(mySwitch.isOn, forKey: "mySwitchValue")
}
但是在应用程序中,当我离开切换视图并 return 进入时,UISwitch 并不像我打开时那样。
应该是rmaddy刚才指出的问题吧。那样的话就去拼吧。
否则,当视图消失时设置开关状态的值可能不是一个明智的选择。当应用程序进入后台时,其他进程会同时运行,并且在应用程序关闭之前可能不会影响设置默认值。
我通常会在调用此类函数时设置此类值,即在切换操作中。一旦用户更改开关状态,将其保存在 defaults
中,这样当您在 viewDidAppear
时检索它,它就会起作用。
import UIKit
class ViewController: UIViewController {
let userDefaults = UserDefaults.standard
@IBOutlet weak var mySwitch: UISwitch!
@IBAction func switchAction(_ sender: UISwitch) {
userDefaults.set(sender.isOn, forKey: "mySwitchValue")
}
override func viewDidAppear(_ animated: Bool) {
mySwitch.isOn = userDefaults.bool(forKey: "mySwitchValue")
}
}
下面的演示:
这不是对您原始问题的回答,而是对评论中另一个问题的回答。 问题:如果应用程序是第一次启动,如何将UISwitch的默认状态设置为打开? 虽然理想情况下,它应该作为另一个问题提出,因为它是增量的,代码如下:
import UIKit
class ViewController: UIViewController {
let userDefaults = UserDefaults.standard
var firstTimeAppLaunch: Bool {
get {
// Will return false when the key is not set.
return userDefaults.bool(forKey: "firstTimeAppLaunch")
}
set {}
}
@IBOutlet weak var mySwitch: UISwitch!
@IBAction func switchAction(_ sender: UISwitch) {
userDefaults.set(sender.isOn, forKey: "mySwitchValue")
}
override func viewDidLoad() {
super.viewDidLoad()
if !firstTimeAppLaunch {
// This will only be trigger first time the application is launched.
userDefaults.set(true, forKey: "firstTimeAppLaunch")
userDefaults.set(true, forKey: "mySwitchValue")
}
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool) {
mySwitch.isOn = userDefaults.bool(forKey: "mySwitchValue")
}
}
请注意,您可以在 AppDelegate 的函数中执行此操作:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Could add the above code within this as well. Upto you.
return true
}