Swift - Как установить начальное значение для NSUserDefaults

У меня есть переключатель под названием 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")
        }
    }

В настоящее время фактическое значение по умолчанию изначально ложно, когда пользователь впервые запускает приложение.

Как реализовать значения по умолчанию, чтобы они были истинными, если пользователь впервые запускает приложение, а они еще не настроены.

Я видел методы в Objective-C, но ничего в Swift. Из того, что я видел, вы можете сделать это в приложении делегат каким-то образом или в файле plist. Как мне сделать один из тех?

9 ответов

Пример синтаксиса Swift 3

Зарегистрируйте логическое значение по умолчанию:

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

И чтобы получить значение:

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

Примечание: хотя приведенный выше код вернет true, обратите внимание, что значение на самом деле не записывается на диск, пока вы его не установите:

UserDefaults.standard.set(true, forKey: "SoundActive")

Добавьте это к вашему 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"
        ])
}

Swift 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

Используя "registerDefaults" вы можете установить значение по умолчанию 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()
 }

Там нет ничего быстрого или конкретного делегата приложения.

Начальные значения по умолчанию устанавливаются путем вызова registerDefaults: на standardUserDefaults пример.

Вы можете сделать этот вызов несколько раз, и я бы порекомендовал вам не делать этого в делегате приложения, вместо этого зарегистрировать соответствующие данные в подходящее время в приложении, поэтому, если у вас есть 1 контроллер / подсистема представления, которая использует определенные значения по умолчанию, тогда зарегистрируйте значения по умолчанию как часть инициализации, если этот код.

Только если у вас есть что-то, что используется несколькими различными частями кода, вы должны рассмотреть возможность сделать это в делегате приложения, и только в том случае, если у вас нет другого подходящего контроллера, в котором это можно сделать.

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 value а также default value, Зависит от вашей необходимости.

Вы можете инкапсулировать все свои 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")
        }
    }

Общая версия того, как установить значение по умолчанию:

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:

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!

Поместите это в "didFinishLaunchingWithOptions" в вашем AppDelegate.

if defaults.valueForKey("launchedAlready") == true {
       print("Not first launch.")
    }
    else {
       defaults.setValue(true, forKey: "launchedAlready")
        defaults.setBool(true, forKey: "SoundActive")
        print("Sound ON")
    }

Установите и активируйте звук.

  var isSoundActivated: Bool {
        get {
            return defaults.bool(forKey: "SoundActive")
        }
        set {
            defaults.set(newValue, forKey: "SoundActive")
            defaults.synchronize()
        }
    }

Установить значение bool с помощью

isSoundActivated = true

проверить значение bool по

if isSoundActivated {
  print("sound activated")
}
Другие вопросы по тегам