Стандартный способ сделать это - метод +(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
По сути, вы устанавливаете все значения по умолчанию в вашем методе инициализации.(Метод инициализации вызывается очень рано, прежде чем вызывается init
, поэтому он обеспечивает удобное место для того, чтобы все значения по умолчанию для пользователя имели значения по умолчанию).registerDefaults:
метод NSUserDefaults
отличается тем, что передаваемые вами значения используются только в том случае, если конкретное значение еще не установлено.Другими словами, когда в приведенном выше коде я установил для первого ключа запуска значение NO в методе applicationDidFinishLaunching:
, он переопределяет значение по умолчанию и будет сохранен в файле списка настроек вашего приложения.Значения, сохраненные в файле настроек, имеют приоритет над значениями, зарегистрированными пользователем по умолчанию в методе initialize
.
Чтобы отложить открытие главного окна, вы в основном хотите убедиться, чтоФлаг «Видимый при запуске» отключен для рассматриваемого окна в инспекторе Атрибутов в Интерфейсном Разработчике:
Этот флаг определяет, будет ли окно отображаться сразуnib загружен, или вам нужно будет сделать это программно, используя что-то вроде makeKeyAndOrderFront:
.