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));
Gracias, Lucas. Tomé un enfoque ligeramente diferente, pero encontré tu traducción del código que publiqué útil. – BruceHill