versiones guia español descargar actualizar iphone objective-c nsuserdefaults application-settings

iphone - guia - ¿Cómo recuperar valores de settings.bundle en el objetivo c?



qgis manual (5)

He creado un proyecto que establece y recupera valores de settings.bundle . También he establecido algunos valores predeterminados en el archivo settings.bundle . Ahora el problema es cuando recupero valores como

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; loginName.text = [defaults objectForKey:@"login_name"];

por primera vez se muestra nulo, pero los valores se configuran en la configuración de la aplicación del iPhone. Si cambio los valores o los configuro manualmente, los valores se recuperan correctamente.

Ayúdame


Actualizado para Swift 3:

func registerDefaultsFromSettingsBundle() { let userDefaults = UserDefaults.standard if let settingsURL = Bundle.main.url(forResource: "Root", withExtension: "plist", subdirectory: "Settings.bundle"), let settings = NSDictionary(contentsOf: settingsURL), let preferences = settings["PreferenceSpecifiers"] as? [NSDictionary] { var defaultsToRegister = [String: AnyObject]() for prefSpecification in preferences { if let key = prefSpecification["Key"] as? String, let value = prefSpecification["DefaultValue"] { defaultsToRegister[key] = value as AnyObject debugPrint("registerDefaultsFromSettingsBundle: (/(key), /(value)) /(type(of: value))") } } userDefaults.register(defaults: defaultsToRegister) } else { debugPrint("registerDefaultsFromSettingsBundle: Could not find Settings.bundle") } }


Aunque define la configuración predeterminada, en realidad no se almacenan como un valor. Se almacenan por defecto. Si intentas leerlo, el valor es nulo. La configuración por defecto es otra propiedad como valor es. Pero no significa que escribirá el valor predeterminado como predeterminado.

Lo que hago es, primero, verificar si alguna configuración (que estoy seguro de que debería tener un valor) tiene algo almacenado. Si no tiene nada, entonces escribo todos los valores por defecto.

Aquí hay un ejemplo.

en AppDelegate.m verifico si email_notificaciones_preference tiene un valor, si no, escribo TODAS las configuraciones predeterminadas para cada configuración.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults]; NSString * email_notificaciones_preference = [standardUserDefaults objectForKey:@"email_notificaciones_preference"]; if (!email_notificaciones_preference) { [self registerDefaultsFromSettingsBundle]; } }

Esta función es la que utilizo para escribir valores predeterminados en cada elemento.

#pragma NSUserDefaults - (void)registerDefaultsFromSettingsBundle { // this function writes default settings as settings NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; if(!settingsBundle) { NSLog(@"Could not find Settings.bundle"); return; } NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; for(NSDictionary *prefSpecification in preferences) { NSString *key = [prefSpecification objectForKey:@"Key"]; if(key) { [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; NSLog(@"writing as default %@ to the key %@",[prefSpecification objectForKey:@"DefaultValue"],key); } } [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; }

Espero que ayude.


Si alguien lo necesita, traduje la respuesta de MIQUEL a Swift (tan bien como pude ya que todavía estoy aprendiendo):

var standardUserDefaults = NSUserDefaults.standardUserDefaults() var us: AnyObject? = standardUserDefaults.objectForKey("your_preference") if us==nil { self.registerDefaultsFromSettingsBundle(); }

Y la función registerDefaultsFromSettingsBundle:

func registerDefaultsFromSettingsBundle() { // this function writes default settings as settings var settingsBundle = NSBundle.mainBundle().pathForResource("Settings", ofType: "bundle") if settingsBundle == nil { NSLog("Could not find Settings.bundle"); return } var settings = NSDictionary(contentsOfFile:settingsBundle!.stringByAppendingPathComponent("Root.plist"))! var preferences: [NSDictionary] = settings.objectForKey("PreferenceSpecifiers") as [NSDictionary]; var defaultsToRegister = NSMutableDictionary(capacity:(preferences.count)); for prefSpecification:NSDictionary in preferences { var key: NSCopying? = prefSpecification.objectForKey("Key") as NSCopying? if key != nil { defaultsToRegister.setObject(prefSpecification.objectForKey("DefaultValue")!, forKey: key!) } } NSUserDefaults.standardUserDefaults().registerDefaults(defaultsToRegister); }


Versión actualizada para Swift 2.1:

func registerDefaultsFromSettingsBundle() { let userDefaults = NSUserDefaults.standardUserDefaults() if let settingsURL = NSBundle.mainBundle().URLForResource("Root", withExtension: "plist", subdirectory: "Settings.bundle"), settings = NSDictionary(contentsOfURL: settingsURL), preferences = settings["PreferenceSpecifiers"] as? [NSDictionary] { var defaultsToRegister = [String: AnyObject]() for prefSpecification in preferences { if let key = prefSpecification["Key"] as? String, value = prefSpecification["DefaultValue"] { defaultsToRegister[key] = value NSLog("registerDefaultsFromSettingsBundle: (/(key), /(value)) /(value.dynamicType)") } } userDefaults.registerDefaults(defaultsToRegister); } else { NSLog("registerDefaultsFromSettingsBundle: Could not find Settings.bundle"); } }


prueba esto

Para registrar valores predeterminados de configuración de paquetes

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:defaultValue forKey:@"key"]; [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];

Antes de recuperar los valores de paquetes de configuración sincronizar datos

[[NSUserDefaults standardUserDefaults] synchronize]