如何在MonoTouch中注册默认值?

时间:2011-05-11 11:08:53

标签: iphone xamarin.ios

我想在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中完成?

2 个答案:

答案 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文件,其中包含所有默认值!(并且它位于您的包的根目录中!)