我想在NSUserDefaults中注册默认值,以便用户设置不会为用户未显式设置的值返回空值,而是返回设置包中指定的默认值。我在这里读到:
How to register user defaults using NSUserDefaults without overwriting existing values?
应在applicationDidFinishLaunching中执行以下操作:
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];
如何在MonoTouch中完成?
答案 0 :(得分:15)
我通过使用此问题中详述的方法解决了这个问题:
Can you make the settings in Settings.bundle default even if you don't open the Settings App
我基本上将其中列出的函数registerDefaultsFromSettingsBundle翻译成MonoTouch。这是一个非常有用的函数,因为它调用registerDefaults作为设置包中列出的默认值。这可确保如果用户未输入任何值,则将返回定义的默认值而不是空值。这可以从AppDelegate的FinishedLaunching调用。
以下是此功能的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开发人员认为这很有用。
更新:
使用最新版本的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));
答案 1 :(得分:2)
您可以尝试以下方式:
NSUserDefaults.StandardUserDefaults.RegisterDefaults(NSDictionary.FromFile("Defaults.plist"));
(假设您已经创建了一个Defaults.plist文件,其中包含所有默认值!(并且它位于您的包的根目录中!)