2011-05-11 15 views
12

Quiero registrar los valores predeterminados en NSUserDefaults para que la configuración del usuario no devuelva valores nulos para valores no establecidos explícitamente por el usuario, sino que devuelva los valores predeterminados especificados en el conjunto de configuraciones. Leí aquí:¿Cómo registro los valores predeterminados en MonoTouch?

How to register user defaults using NSUserDefaults without overwriting existing values?

que el siguiente debe ser ejecutado en applicationDidFinishLaunching:

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]]; 

¿Cómo se puede hacer esto en MonoTouch?

Respuesta

2

Usted podría intentar algo en la línea de: (! Suponiendo que haya creado un archivo Defaults.plist con todos sus valores por defecto en (y está en la raíz de su paquete))

NSUserDefaults.StandardUserDefaults.RegisterDefaults(NSDictionary.FromFile("Defaults.plist")); 

+0

Gracias, Lucas. Tomé un enfoque ligeramente diferente, pero encontré tu traducción del código que publiqué útil. – BruceHill

15

he resuelto esto utilizando el método detallado en esta pregunta:

Can you make the settings in Settings.bundle default even if you don't open the Settings App

básicamente traduje The Register función rDefaultsFromSettingsBundle enumerado allí en MonoTouch. Esta es una función muy útil porque llama a registerDefaults para los valores predeterminados enumerados en el conjunto de configuraciones. Esto garantiza que si el usuario no ha ingresado ningún valor, se devolverán los valores predeterminados definidos en lugar de valores nulos. Esto se puede invocar desde FinishedLaunching de AppDelegate.

Aquí está la versión MonoTouch de esta función:

public static void RegisterDefaultsFromSettingsBundle() 
{ 
    string settingsBundle = NSBundle.MainBundle.PathForResource("Settings", @"bundle"); 
    if(settingsBundle == null) { 
     System.Console.WriteLine(@"Could not find Settings.bundle"); 
     return; 
    } 
    NSString keyString = new NSString(@"Key"); 
    NSString defaultString = new NSString(@"DefaultValue"); 
    NSDictionary settings = NSDictionary.FromFile(Path.Combine(settingsBundle,@"Root.plist")); 
    NSArray preferences = (NSArray) settings.ValueForKey(new NSString(@"PreferenceSpecifiers")); 
    NSMutableDictionary defaultsToRegister = new NSMutableDictionary(); 
    for (uint i=0; i<preferences.Count; i++) { 
     NSDictionary prefSpecification = new NSDictionary(preferences.ValueAt(i)); 
     NSString key = (NSString) prefSpecification.ValueForKey(keyString); 
     if(key != null) { 
      NSObject def = prefSpecification.ValueForKey(defaultString); 
      if (def != null) { 
       defaultsToRegister.SetValueForKey(def, key); 
      } 
     } 
    } 
    NSUserDefaults.StandardUserDefaults.RegisterDefaults(defaultsToRegister); 
} 

espero que otros desarrolladores MonoTouch encontrar esto útil.

ACTUALIZACIÓN:

Con la última versión de Xamarin.iOS este código va a lanzar una excepción en esta línea:

NSDictionary prefSpecification = new NSDictionary(preferences.ValueAt(i)); 

Tenga en cuenta que esta excepción no se produce debido a iOS 8 sino porque Xamarin ha decidido hacer el constructor de que el código depende de privado, por lo que el constructor requerido no está disponible para ser utilizado. Resolví esta subclase NSDictionary así:

public class CustomNSDictionary: NSDictionary 
{ 
    public CustomNSDictionary (IntPtr ptr): base(ptr) {} 
} 

A continuación, se puede reemplazar la línea problemática con lo siguiente:

CustomNSDictionary prefSpecification = new CustomNSDictionary(preferences.ValueAt(i)); 
+0

Muy útil, gracias por el fragmento! Estaba usando 'XDocument' para leer el plist. Eso funcionó en el simulador, pero no en el dispositivo, porque el plist está compilado en un formato binario. Tu código funciona como un amuleto tanto en el simulador como en el dispositivo :) –

+0

De nada, Niels. Me alegro de que lo haya encontrado útil. :) – BruceHill

+0

Hace lo que dice en la lata. ¡Gracias por compartir esto! –

Cuestiones relacionadas