ios - 我什么时候应该调用 [NSUserDefaults standardUserDefaults] registerDefaults :] to ensure that . xib 文件可以立即访问首选项?

标签 ios objective-c macos cocoa-touch cocoa

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

我在应用委托(delegate)中注册了默认值:

- (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: 以便可以使用默认 prefs 来设置 .xib 文件接口(interface)对象?

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

最佳答案

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

+ (void)initialize {
     NSDictionary *defaultPrefs = [NSDictionary dictionaryWithObject:
                   [NSNumber numberWithBool:YES] forKey:@"isEnabled"];
     [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];
}

关于ios - 我什么时候应该调用 [NSUserDefaults standardUserDefaults] registerDefaults :] to ensure that . xib 文件可以立即访问首选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15553659/

相关文章:

iOS - 计时器调用问题

objective-c - 为什么我向同一个方向快速滑动两次时,UIScrollView 会剧烈滚动?

swift - 为什么 NSLocale.current.identifier 在 macOS 上包含货币?

c++ - 无法在 SDL2 (MAC M1) 中正确渲染三角形

ios - 什么可能导致图像在标签栏 iOS 中看起来很难看?

ios - SWIFT:填写 HTML 输入 [类型 =“text”]

ios - 在Mobile Safari中打开附件

ios - 返回数组时不兼容的 block 指针类型?

macos - MAC上的grep特定文件类型

ios - Swift、Firebase、Flashlight,如何存储数组?