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.