Подтвердить что ты не робот

Как регистрировать значения по умолчанию в MonoTouch?

Я хочу зарегистрировать значения по умолчанию в NSUserDefaults, чтобы пользовательские настройки не возвращали нулевые значения для значений, явно не заданных пользователем, а скорее возвращали значения по умолчанию, указанные в наборе параметров. Я читаю здесь:

Как регистрировать пользовательские значения по умолчанию с помощью NSUserDefaults без перезаписывания существующих значений?

чтобы в applicationDidFinishLaunching выполнялось следующее:

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

Как это можно сделать в MonoTouch?

4b9b3361

Ответ 1

Вы можете попробовать что-то по строкам:

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

(предположим, что вы создали файл Defaults.plist со всеми вашими значениями по умолчанию в! (и это в корне вашего пакета!))

Ответ 2

Я решил это, используя метод, подробно описанный в этом вопросе:

Можете ли вы сделать настройки в Настройке.Бандле по умолчанию, даже если вы не открываете приложение настроек

Я в основном перевел функцию registerDefaultsFromSettingsBundle, указанную там в MonoTouch. Это очень полезная функция, потому что она вызывает registerDefaults для значений по умолчанию, перечисленных в наборе параметров. Это гарантирует, что если пользователь не введет какие-либо значения, то будут возвращены определенные значения по умолчанию, а не нулевые значения. Это можно вызвать из FinishedLaunching из AppDelegate.

Вот версия этой функции MonoTouch:

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

Я надеюсь, что другие разработчики MonoTouch найдут это полезным.

UPDATE:

В последней версии Xamarin.iOS этот код генерирует исключение в этой строке:

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

Обратите внимание, что это исключение не возникает из-за iOS 8, а потому, что Xamarin решил сделать конструктор, что код зависит от частного, поэтому требуемый конструктор недоступен для использования. Я решил это путем подклассификации NSDictionary следующим образом:

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

Затем вы можете заменить проблемную строку следующим образом:

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