我正在创建一个应用程序,我希望用户在首次启动应用程序时设置一些强制性偏好。实现这一目标的最常见方案是什么?我应该设置一些用户默认值来查看应用程序是否已设置?另外 - 如果我确定该应用程序是第一次启动 - 我应该如何显示“设置”窗口?如果我从单独的 xib 文件加载它 - 我将如何延迟主应用程序窗口的显示?
问问题
911 次
1 回答
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 的属性检查器中关闭相关窗口的“启动时可见”标志:
正是该标志决定了是否在加载 nib 后立即显示窗口,或者您是否需要使用类似makeKeyAndOrderFront:
.
于 2010-12-25T11:34:57.727 回答