使用 UserDefaults 保存和检索布尔值
Posted
技术标签:
【中文标题】使用 UserDefaults 保存和检索布尔值【英文标题】:Saving and retrieving a bool with UserDefaults 【发布时间】:2017-02-27 05:02:31 【问题描述】:我正在尝试将 bool 值从 UISwitch 保存到 UserDefaults,然后在另一个视图中检索它。但是,我尝试了多个教程和堆栈答案,但似乎没有一个有效。
这就是我保存它的方式:
class SettingsViewController: UITableViewController
@IBOutlet weak var soundSwitchOutlet: UISwitch!
@IBAction func soundSwitch(_ sender: UISwitch)
UserDefaults.standard.set(soundSwitchOutlet.isOn, forKey: "sound")
这就是我试图在另一个视图中检索它的方式:
if let savedValue = UserDefaults.standard.bool(forKey: "sound")
boolValue = savedValue
//this is inside viewDidLoad and "boolValue" was declared outside viewDidLoad//
由于某种原因,这段代码给了我错误,而我尝试过的所有方法都没有奏效。如何将 bool 保存到 UserDefaults 并在另一个视图中检索它?
编辑:我想我修复了第一部分。但是,我检索布尔值的方式似乎完全错误。另外:没有其他 stackExchange 答案可以响应我的要求,至少不会很快。
【问题讨论】:
***.com/questions/34373668/… 的可能重复项?UserDefaults.standard.set(sender.isOn, forKey: "sound")
为键读取 bool 会返回一个 Bool(非可选)boolValue = UserDefaults.standard.bool(forKey: "sound")
【参考方案1】:
正如 Leo 在 cmets 中提到的 bool(forKey
返回一个非可选的 Bool
。如果key不存在则返回false
。
原来如此
boolValue = UserDefaults.standard.bool(forKey: "sound")
不需要按照其他答案中的建议调用synchronize()
。框架会定期更新用户默认数据库。
【讨论】:
谢谢!开关的状态保持保存,但是当我尝试在另一个视图上使用布尔值时,它会卡在它开始的布尔值上。 不要滥用UserDefaults
作为临时存储或在控制器之间传递数据。【参考方案2】:
这样做。
在你的first view controller
。
创建到您的UISwitch
的IBoutlet
连接
然后是您的UISwitch
的操作。所以最后,你的first view controller
应该是这样的。
导入 UIKit
class FirstViewController: UIViewController
@IBOutlet weak var myswitch: UISwitch! // Outlet connection to your UISwitch (just control+ drag it to your controller)
override func viewDidLoad()
super.viewDidLoad()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
@IBAction func myswitchAction(_ sender: Any) // Action for your UISwitch
var myswitctBool : Bool = false // create a local variable that holds your bool value. assume that in the beginning your switch is offed and the boolean value is `false`
if myswitch.isOn == true // when user turn it on then set the value to `true`
myswitctBool = true
else // else set the value to false
myswitctBool = false
// finally set the value to user default like this
UserDefaults.standard.set(myswitctBool, forKey: "mySwitch")
//UserDefaults.standard.synchronize() - this is not necessary with ios 8 and later.
第一个视图控制器结束
现在在您的第二个视图控制器中
你可以得到userdefault
的值,这是你在first view controller
中设置的。我把它放在viewdidload
方法中,向你展示它是如何工作的。
导入 UIKit
class SecondViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
let myswitchBoolValuefromFirstVc : Bool = UserDefaults.standard.bool(forKey: "mySwitch")// this is how you retrieve the bool value
// to see the value, just print those with conditions. you can use those for your things.
if myswitchBoolValuefromFirstVc == true
print("true")
else
print("false")
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
希望对您有所帮助。祝你好运
【讨论】:
是的 @EricAya 我们不再需要它从 iOS 8。接受,我将删除它。谢谢【参考方案3】:使用这行代码:
@IBAction func soundSwitch(_ sender: UISwitch)
UserDefaults.standard.set(soundSwitchOutlet.isOn, forKey: "sound")
代替:
@IBAction func soundSwitch(_ sender: UISwitch)
UserDefaults.standard.set(soundSwitchOutlet, forKey: "sound")
【讨论】:
【参考方案4】:试试这个:
@IBAction func soundSwitchs(_ sender: Any)
UserDefaults.standard.set(soundSwitchOutlet.isOn, forKey: "sound")
UserDefaults.standard.synchronize()
//this is inside viewDidLoad and "boolValue" was declared outside viewDidLoad//
boolValue = UserDefaults.standard.bool(forKey: "sound")
【讨论】:
.synchronize()
没用。运行测试,你自己看看。以上是关于使用 UserDefaults 保存和检索布尔值的主要内容,如果未能解决你的问题,请参考以下文章
检索 UserDefaults 后在 viewdidload 上刷新 collectionView
Swift 5 将 AVAsset 保存到 UserDefaults
使用 struct id 将收藏夹保存到 UserDefaults