Xamarin.iOS 中未加载设置包的默认值
Default values from settings bundle are not loaded in Xamarin.iOS
在我的项目中,我定义了一个包含 Root.plist 的 settings.bundle 和多个设置,所有设置都有默认值。
但是,在新设备上首次启动时,这些默认设置会显示在设置应用程序中,但不会加载。
这里出了什么问题?
原来,这是故意的。 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();
}
希望这对某人有所帮助
在我的项目中,我定义了一个包含 Root.plist 的 settings.bundle 和多个设置,所有设置都有默认值。 但是,在新设备上首次启动时,这些默认设置会显示在设置应用程序中,但不会加载。
这里出了什么问题?
原来,这是故意的。 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();
}
希望这对某人有所帮助