Swift - 如何为NSUserDefaults设置初始值

Big*_*tor 33 nsuserdefaults uiswitch ios swift

我有一个名为soundSwitch的开关,我正在使用用户默认值保存按钮的状态:

@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")
        }
    }
Run Code Online (Sandbox Code Playgroud)

当前,当用户首次启动应用程序时,实际默认值最初为false.

如果用户首次启动应用程序并且尚未配置它,我如何将默认值实现为true.

我在Objective-C中看过方法,但在Swift中没有.从我所看到的你可以在app中委托一些方法,或者在plist文件中.我该怎么办?

小智 55

Swift 3语法示例

注册一个布尔默认值:

UserDefaults.standard.register(defaults: ["SoundActive" : true])
Run Code Online (Sandbox Code Playgroud)

获得价值:

UserDefaults.standard.bool(forKey: "SoundActive")
Run Code Online (Sandbox Code Playgroud)

旁注:虽然上面的代码将返回true,但请注意,在您设置之前,该值实际上并未写入磁盘:

UserDefaults.standard.set(true, forKey: "SoundActive")
Run Code Online (Sandbox Code Playgroud)


fs_*_*gre 17

didFinishLaunchingWithOptions从AppDelegate 将其添加到您的方法中.正如其他一些人所指出的那样,尽量不要滥用这种方法.

 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"
        ])
}
Run Code Online (Sandbox Code Playgroud)


Har*_*kar 7

使用"registerDefaults"可以设置NSUserDefaults的默认值

let userDefaultsDefaults = [
            "SoundActive" : true
        ]

NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)
Run Code Online (Sandbox Code Playgroud)

注意:在didFinishLaunchingWithOptions中写入此内容,因此设置了默认值.

在下面写下您要检查的代码

 let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool!

 if (onoroff != nil && onoroff == false)
 {
    self.checkForAgreement()
 }
Run Code Online (Sandbox Code Playgroud)


Wai*_*ain 5

没有任何 swift 或应用程序委托特定的内容。

初始默认值是通过调用实例来设置registerDefaults:standardUserDefaults

您可以多次进行此调用,我建议您不要在应用程序委托中执行此操作,而是在应用程序中的适当时间注册适当的详细信息,因此,如果您有 1 个使用某些默认值的视图控制器/子系统,那么将默认值注册为该代码初始化的一部分。

仅当您有代码的多个不同部分使用的内容时,您才应考虑在应用程序委托中执行此操作,并且仅当您没有其他合适的控制器来执行此操作时。

  • 但是用户默认注册应该在其他任何事情之前完成,这就是为什么“didFinishLaunchingWithOptions”将是一个相当明显的地方,并且在大多数项目中都可以找到它。另外,我认为将所有默认值放在一个地方比在整个项目中拥有多个“registerDefaults”更好。 (3认同)

Guy*_*ker 5

斯威夫特4

我更喜欢实现类似于如果未设置值则UserDefaults.string(forKey: )返回的函数nil。结合?? 运算符,除非您稍后明确设置它们,否则无需将任何默认值写入磁盘。

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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以按以下方式检索默认值

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
Run Code Online (Sandbox Code Playgroud)