Swift - 如何为NSUserDefaults设置初始值

时间:2016-06-15 08:52:20

标签: ios swift nsuserdefaults uiswitch

我有一个名为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")
        }
    }

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

如果用户首次启动应用程序并且尚未配置,则如何将默认值设置为true。

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

10 个答案:

答案 0 :(得分:54)

Swift 3语法示例

注册一个布尔默认值:

    package main

    import (
        "fmt"
        "time"
    )

    func main() {
        messages := make(chan int)
        go func() {
            time.Sleep(time.Second * 3)
            messages <- 1
        }()
        go func() {
            time.Sleep(time.Second * 2)
            messages <- 2
        }() 
        go func() {
            time.Sleep(time.Second * 1)
            messages <- 3
        }()
        go func() {
            for i := range messages {
                fmt.Println(i)
            }
        }()
        go func() {
            time.Sleep(time.Second * 1)
            messages <- 4
        }()
        go func() {
            time.Sleep(time.Second * 1)
            messages <- 5
        }()
        time.Sleep(time.Second * 5)
    }

获取值:

UserDefaults.standard.register(defaults: ["SoundActive" : true])

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

UserDefaults.standard.bool(forKey: "SoundActive")

答案 1 :(得分:14)

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

 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"
        ])
}

答案 2 :(得分:7)

使用&#34; registerDefaults&#34;您可以设置NSUserDefaults的默认值

let userDefaultsDefaults = [
            "SoundActive" : true
        ]

NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)

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

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

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

 if (onoroff != nil && onoroff == false)
 {
    self.checkForAgreement()
 }

答案 3 :(得分:4)

没有特定的swift或app delegate。

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

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

只有当你有一些代码的多个不同部分使用的东西时,你应该考虑在app委托中这样做,然后只有你没有其他适当的控制器才能这样做。

答案 4 :(得分:2)

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
    }
}

我认为这是使用它的最佳方式。另外register(defaults:)会有所帮助,但在文档中,Apple建议将其用作fallback,例如分隔no valuedefault value的情况。取决于你的需要。

答案 5 :(得分:2)

快捷键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
    }
}

然后您可以按以下方式获取默认值

let defaults = UserDefaults.standard
let userName = defaults.string(forKey: "Username") ?? "Happy"
let userAge = defaults.optionalInt(forKey: "Age") ?? 21
let isSmart = defaults.optionalInt(forKey: "Smart") ?? true

答案 6 :(得分:0)

如果你真的想这样做,请把它放在AppDelegate中:

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方法中!

答案 7 :(得分:0)

您可以将所有UserDefaults逻辑封装到一个属性变量中,该属性变量会自动注册应用程序默认值,并将所有更新保存回用户默认值字典中。如果应用程序的其他部分(除了开关控件之外)也读取或更改此状态,则这特别方便。

Swift 5 -第一部分执行闭包以初始化属性,第二部分是didSet块,该属性在每次更改属性时都会自动调用。

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")
        }
    }

答案 8 :(得分:0)

如何设置默认值的通用版本:

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) ?? ""

答案 9 :(得分:-1)

把它放在你的&#34; didFinishLaunchingWithOptions&#34;在你的AppDelegate中。

<?php
session_start();
include_once("includes/class.database.php");


if(isset($_SESSION['id'])){
    include("ingelogd.php"); //When signed in
}else{
    include("inloggen.php"); //when not signed in
}
?>