4

我需要注册默认首选项值,然后界面在启动时立即使用这些值来设置复选框状态等。

我在应用程序委托中注册了默认值:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{ 
    NSLog(@"Did finish launching");
    NSDictionary *defaultPrefs = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"isEnabled"];
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];
}

然后,在通过 MainMenu.xib 文件创建的对象中,我想使用默认值:

- (void)awakeFromNib
{
    NSLog(@"Awake from nib");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [self.checkbox setState:([defaults boolForKey:@"isEnabled"] ? NSOnState : NSOffState)];
}

但是这些调用顺序错误!

> Awake from nib
> Did finish launching
// Preference == `nil` or `0`, not the default value I set.

因此,当我想使用它们时,没有设置默认首选项。

我应该在哪里registerDefaults:使用默认首选项来设置 .xib 文件接口对象?

我是否使用了错误的委托方法?applicationDidFinishLaunching/ awakeFromNib? 有哪些替代方案?

4

2 回答 2

3

我通常在+initialize将使用它们的控制器对象的类方法中注册默认值。+initialize是在对象的生命周期中调用的最早方法之一,因此它确保它们尽早注册。

+ (void)initialize {
     NSDictionary *defaultPrefs = [NSDictionary dictionaryWithObject:
                   [NSNumber numberWithBool:YES] forKey:@"isEnabled"];
     [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];
}
于 2013-03-21T20:06:28.040 回答
1

init在您的应用委托类的方法中注册默认值。这将确保他们首先注册。

于 2013-03-21T17:05:08.593 回答