【问题标题】:Default values from settings bundle are not loaded in Xamarin.iOS设置包中的默认值未在 Xamarin.iOS 中加载
【发布时间】:2016-12-21 09:13:16
【问题描述】:

在我的项目中,我定义了一个 settings.bundle,其中包含一个具有多个设置的 Root.plist,它们都有默认值。 但是,在新设备上首次启动时,这些默认设置会显示在设置应用程序中,但不会加载。

这里出了什么问题?

【问题讨论】:

    标签: ios xamarin nsuserdefaults default-value settings.bundle


    【解决方案1】:

    事实证明,这是故意的。 Settings.bundle 中的 DefaultValue 规范仅用于显示目的。 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();
    }
    

    希望这对某人有所帮助

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2015-01-26
      • 1970-01-01
      • 2011-03-29
      • 2012-05-19
      相关资源
      最近更新 更多