第一次启动时Cocoa应用程序设置最常见的情况是什么?

时间:2010-12-24 10:37:47

标签: cocoa installation application-design

我正在创建一个应用程序,我希望用户在首次启动应用程序时设置一些强制性首选项。实现这一目标的最常见方案是什么?我应该设置一些用户默认值以查看应用程序是否已设置?此外 - 如果我确定该应用程序是第一次启动 - 我应该如何显示“设置”窗口?如果我从separte xib文件加载它 - 我将如何设置主应用程序窗口的显示?

1 个答案:

答案 0 :(得分:3)

执行此操作的标准方法是在主控制器类的+(void)initialize方法中。

例如,在您的界面(.h)中:

@interface MDAppController : NSObject {
    BOOL MDFirstRun;
    BOOL showInspector;
    BOOL showIcons;
}
@end

然后在你的.m文件中:

NSString * const MDFirstRunKey            = @"MDFirstRun";
NSString * const MDShouldShowInspectorKey  = @"MDShouldShowInspector";
NSString * const MDBrowserShouldShowIconsKey  = @"MDBrowserShouldShowIcons";

@implementation 

+ (void)initialize {
    NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary];

    [defaultValues setObject:[NSNumber numberWithBool:YES]
                      forKey:MDFirstRunKey];

    [defaultValues setObject:[NSNumber numberWithBool:NO]
                      forKey:MDShouldShowInspectorKey];

    [defaultValues setObject:[NSNumber numberWithBool:YES]
                      forKey:MDBrowserShouldShowIconsKey];

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
    [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:defaultValues];
}

换行

- (id)init {
   if (self = [super init]) {
       NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

       MDFirstRun = [[userDefaults objectForKey:MDFirstRunKey] boolValue];
       showInspector = [[userDefaults objectForKey:MDShouldShowInspectorKey] boolValue];
       showIcons = [[userDefaults objectForKey:MDBrowserShouldShowIconsKey] boolValue];
   }
   return self;
}



- (void)applicationDidFinishLaunching:(NSNotification *)notification {
   if (MDFirstRun) {
     [[NSUserDefaults standardUserDefaults]
         setObject:[NSNumber numberWithBool:NO]
         forKey:MDFirstRunKey];

     // show first use panel

   } else {
     // do normal launch
   }
}

 /// other methods
@end

基本上,您在initialize方法中设置了所有默认值。 (初始化方法在调用init之前很早就调用,因此它提供了一个方便的位置来确保用户默认值都具有默认值)。 registerDefaults: NSUserDefaults方法的特殊之处在于,只有在尚未设置特定值时才会使用您传入的值。换句话说,在上面的代码中,我在applicationDidFinishLaunching:方法中将第一个启动键设置为NO,它会覆盖默认值并将保存到应用程序的首选项plist文件中。保存在首选项文件中的值优先于您在initialize方法中使用用户默认值注册的值。

要推迟打开主窗口,您基本上要确保在Interface Builder的“属性”检查器中为相关窗口关闭“可见启动”标志:

alt text

该标志用于确定加载笔尖后是否显示窗口,或者是否需要使用makeKeyAndOrderFront:等编程方式执行此操作。