ios swift nsuserdefaults uiswitch

ios - Swift-Cómo establecer el valor inicial para NSUserDefaults



uiswitch (9)

Agregue esto a su método didFinishLaunchingWithOptions desde el AppDelegate. Como algunos otros señalaron, trate de no abusar poniendo todo en este método.

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

Tengo un interruptor llamado soundSwitch, estoy guardando el estado del botón usando un valor predeterminado del usuario como tal:

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

Actualmente, el valor predeterminado real es inicialmente falso cuando el usuario inicia la aplicación por primera vez.

¿Cómo implemento que los valores predeterminados sean verdaderos si el usuario está iniciando la aplicación por primera vez y aún no se ha configurado?

He visto métodos en Objective-C, pero nada en Swift. Por lo que he visto, puede hacerlo en la aplicación delegar de alguna manera, o en un archivo plist. ¿Cómo hago cualquiera de esos?


Establecer y obtener el sonido activado.

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

Establecer el valor bool por

isSoundActivated = true

verifique el valor bool

if isSoundActivated { print("sound activated") }


No hay nada rápido o específico de la aplicación delegado.

Los valores predeterminados iniciales se establecen llamando a registerDefaults: en la instancia de standardUserDefaults .

Puede hacer esta llamada varias veces y le recomiendo que no lo haga en el delegado de la aplicación, en lugar de eso, registre los detalles apropiados en los momentos apropiados en la aplicación, por lo que si tiene 1 controlador / subsistema de vista que usa ciertos valores predeterminados, entonces Registre los valores predeterminados como parte de la inicialización de ese código.

Solo si tiene algo que es usado por varias partes diferentes del código, debe considerar hacerlo en el delegado de la aplicación, y solo si no tiene otro controlador apropiado para hacerlo.


Ponga esto en su "didFinishLaunchingWithOptions" en su AppDelegate.

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


Si realmente quieres hacerlo de esta manera, coloca esto en el AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let defaults = NSUserDefaults.standardUserDefaults() if defaults.valueForKey("SoundActive") == nil { defaults.setBool(true, forKey: "SoundActive") }

Si solo se usa en el controlador de una vista, ¡considere poner el código en el método viewDidLoad en su lugar!


Ejemplo de sintaxis de Swift 3

Registrar un valor predeterminado booleano:

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

Y para obtener el valor:

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

Nota al margen: Aunque el código anterior devolverá verdadero, tenga en cuenta que el valor no se escribe realmente en el disco hasta que lo establezca :

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


Swift 4

Prefiero implementar una función similar a UserDefaults.string (forKey:) que devuelve nil si el valor no está establecido. Combinado con el ?? operador, no necesita tener ningún valor predeterminado escrito en el disco a menos que los configure explícitamente más adelante.

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

A continuación, puede recuperar sus valores predeterminados de la siguiente manera

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


Usando "registerDefaults" puede establecer el valor predeterminado de NSUserDefaults

let userDefaultsDefaults = [ "SoundActive" : true ] NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)

Nota: escriba esto en didFinishLaunchingWithOptions, para que se establezca el valor predeterminado.

Escriba abajo el código donde quiere revisar

let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool! if (onoroff != nil && onoroff == false) { self.checkForAgreement() }


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

Creo que esta es la mejor manera de usarlo. También el register(defaults:) ayudará, pero en la documentación Apple sugiere usarlo como fallback , como separar la situación no value y default value . Depende de tu necesidad.