2016-12-21 5 views
0

В моем проекте я определил файл settings.bundle, содержащий Root.plist с несколькими настройками, которые имеют значения по умолчанию. Однако при первом запуске нового устройства эти значения по умолчанию отображаются в приложении настроек, но не загружаются.Значения по умолчанию из комплекта настроек не загружены в Xamarin.iOS

Что здесь не так?

ответ

1

Оказалось, что это предназначено. Спецификация DefaultValue в Settings.bundle служит только для показа. Found on ijure.org

Там вы также найдете решение в Objective C, чтобы получить значения по умолчанию и записать их в словарь настроек, если значения уже нет.

я переписал его с вдохновением от this answer to a similar question:

private static void RegisterDefaultsFromSettingsBundle() 
{ 
    var defaults = NSUserDefaults.StandardUserDefaults; 
    defaults.Synchronize(); 

    var settingsBundle = NSBundle.MainBundle.PathForResource(@"Settings", @"bundle"); 

    if (string.IsNullOrEmpty(settingsBundle)) 
    { 
     Console.WriteLine("Could not find Settings.bundle!"); 
     return; 
    } 

    var settings = NSDictionary.FromFile(settingsBundle + @"/Root.plist"); 
    var preferences = settings[(NSString)"PreferenceSpecifiers"] as NSArray; 

    using (var defaultsToRegister = new NSMutableDictionary()) 
    { 
     if (preferences != null) 
     { 
      foreach (var prefItem in NSArray.FromArray<NSDictionary>(preferences)) 
      { 
       var key = prefItem[(NSString) "Key"] as NSString; 

       if (key != null) 
       { 
        var currentObject = defaults[key]; 
        if (currentObject == null) 
        { 
         // Not yet set in the defaults 
         var defaultValue = prefItem[@"DefaultValue"]; 
         defaultsToRegister.Add(key, defaultValue); 
         Console.WriteLine($"Setting value '{defaultValue}' for key '{key}'"); 
        } 
        else 
        { 
         // Already set in the defaults: don't touch 
         Console.WriteLine($"Key '{key}' is readable (value: '{currentObject}'), nothing written to defaults."); 
        } 
       } 
      } 
     } 

     defaults.RegisterDefaults(defaultsToRegister); 
    } 
    defaults.Synchronize(); 
} 

Надеется, что это помогает кто-то