什么';Cocoa应用程序首次启动时最常见的场景是什么?

什么';Cocoa应用程序首次启动时最常见的场景是什么?,cocoa,installation,application-design,Cocoa,Installation,Application Design,我正在创建一个应用程序,我希望用户在第一次应用程序启动时设置一些必需的首选项。实现这一目标最常见的场景是什么?我是否应该设置一些用户默认值以查看应用程序是否已安装?另外-如果我确定应用程序是第一次启动-我应该如何显示“设置”窗口?如果我从separte xib文件加载它-我将如何定义主应用程序窗口的显示?执行此操作的标准方法是在主控制器类的+(void)initialize方法中 例如,在界面(.h)中: 然后在.m文件中: NSString * const MDFirstRunKey

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

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

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

然后在.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方法中设置所有默认值。(initialize方法在调用
init
之前很早就被调用了,因此它提供了一个方便的地方来确保用户默认值都有默认值)。
NSUserDefaults
registerDefaults:
方法的特殊之处在于,您传入的值仅在尚未设置特定值时使用。换句话说,在上面的代码中,我在
applicationdFinishLaunching:
方法中将first launch键设置为NO,该方法覆盖默认值并将保存到应用程序的preferences plist文件中。保存在首选项文件中的值优先于在
initialize
方法中使用用户默认值注册的值

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


正是这个标志决定了一个窗口是否在nib加载后立即显示,或者您是否需要使用类似于
MakeKeyandDerfront:

的编程方式来执行此操作。通常我们不这样做。选择一些合理的默认设置,这样人们就可以立即启动并运行你的应用程序。或者我们说的是web服务的登录凭据之类的东西?我们说的是在SO站点上构建的包装器(想想StackApps)。在不同的主题上有各种各样的网站,所以我不想强迫潜在的“老练建议”(烹饪)网站用户默认使用“堆栈溢出”。只需使用NSUserDefaults跟踪启动计数即可。就这么简单。
- (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