Swift - How to set initial value for NSUserDefaults
我有一个名为soundSwitch的开关,我正在使用用户默认值来保存按钮的状态,例如:
1 2 3 4 5 6 7 8 9 | @IBAction func soundsChanged(sender: AnyObject) { if soundSwitch.on{ defaults.setBool(true, forKey:"SoundActive") print("Sound ON") }else{ defaults.setBool(false, forKey:"SoundActive") print("Sound OFF") } } |
当前,当用户首次启动应用程序时,实际的默认值最初为false。
如果用户首次启动该应用并且尚未对其进行配置,那么如何实现默认值true。
我在Objective-C中看到过方法,但是在Swift中什么都没看到。从我所看到的,您可以在应用程序委托中以某种方式或在plist文件中进行操作。我该怎么做?
Swift 3语法示例
注册一个布尔默认值:
1 | UserDefaults.standard.register(defaults: ["SoundActive" : true]) |
并获取值:
1 | UserDefaults.standard.bool(forKey:"SoundActive") |
旁注:尽管上面的代码将返回true,但是请注意,只有在设置好该值后,该值才真正写入磁盘:
1 | UserDefaults.standard.set(true, forKey:"SoundActive") |
通过AppDelegate将其添加到您的
1 2 3 4 5 6 7 8 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { /// Here you can give default values to your UserDefault keys UserDefaults.standard.register(defaults: [ "SoundActive": true, "someOtherKey":"Some Message" ]) } |
雨燕4
我更喜欢实现类似于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | extension UserDefaults { public func optionalInt(forKey defaultName: String) -> Int? { let defaults = self if let value = defaults.value(forKey: defaultName) { return value as? Int } return nil } public func optionalBool(forKey defaultName: String) -> Bool? { let defaults = self if let value = defaults.value(forKey: defaultName) { return value as? Bool } return nil } } |
然后您可以按以下方式检索默认值
1 2 3 4 | let defaults = UserDefaults.standard let userName = defaults.string(forKey:"Username") ??"Happy" let userAge = defaults.optionalInt(forKey:"Age") ?? 21 let isSmart = defaults.optionalBool(forKey:"Smart") ?? true |
使用" registerDefaults"可以设置NSUserDefaults的默认值
1 2 3 4 5 | let userDefaultsDefaults = [ "SoundActive" : true ] NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults) |
注意:将其写在didFinishLaunchingWithOptions中,以便设置默认值。
在要检查的地方的下面的代码中写
1 2 3 4 5 6 | let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool! if (onoroff != nil && onoroff == false) { self.checkForAgreement() } |
没有特定的快捷方式或应用程序委托。
通过在
您可以多次调用此程序,建议您不要在应用程序委托中进行此调用,而应在适当的时间在应用程序中注册适当的详细信息,因此,如果您有1个使用某些特定控件的视图控制器/子系统默认值,然后将默认值注册为初始化的一部分(如果该代码)。
仅当您的代码被多个不同部分使用时,才应考虑在应用程序委托中执行此操作,并且仅当您没有其他合适的控制器可以使用它时。
您可以将所有
Swift 5-第一部分执行一个闭包以初始化属性,第二部分是
1 2 3 4 5 6 7 8 9 10 11 12 13 | var soundIsActive: Bool = { // Register the app default: UserDefaults.standard.register(defaults: ["SoundActive" : true]) // Initialize the property with the current user default: return UserDefaults.standard.bool(forKey:"SoundActive") }() { didSet { // Update user default when the variable is set: UserDefaults.standard.set(soundIsActive, forKey:"SoundActive") } } |
1 2 3 4 5 6 7 8 9 10 | func lastStatus() -> Bool { let defaultValue = true if let value = default.valueForKey("SoundActive") { // then use it return value as? Bool ?? defaultValue } else { // oh, no value? return defaultValue } } |
我认为这是使用它的最佳方法。
如何设置默认值的通用版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | enum UserDefaultsKeys: String { case username ="kUsername" } extension UserDefaults { func optionalValue< T >(forKey key: UserDefaultsKeys) -> T? { if let value = self.value(forKey: key.rawValue) { return value as? T } return nil } } let username = defaults.optionalValue(forKey: .username) ??"" |
如果您真的想这样做,请将其放在AppDelegate中:
1 2 3 4 5 6 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let defaults = NSUserDefaults.standardUserDefaults() if defaults.valueForKey("SoundActive") == nil { defaults.setBool(true, forKey:"SoundActive") } |
如果仅在一个viewcontroller中使用它,请考虑将代码放在viewDidLoad方法中!
将其放在AppDelegate的" didFinishLaunchingWithOptions"中。
1 2 3 4 5 6 7 8 | if defaults.valueForKey("launchedAlready") == true { print("Not first launch.") } else { defaults.setValue(true, forKey:"launchedAlready") defaults.setBool(true, forKey:"SoundActive") print("Sound ON") } |