2013-03-21 35 views
4

我需要註冊默認首選項值,然後將其立即在啓動設置複選框的狀態所用的接口等什麼時候應該調用[NSUserDefaults standardUserDefaults] registerDefaults:]以確保.xib文件能夠立即訪問首選項?

我註冊在應用程序委託默認值:

- (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文件接口對象?

我使用錯誤的委託方法嗎? applicationDidFinishLaunching/awakeFromNib?有什麼選擇?

回答

1

在您的應用程序委託類的init方法中註冊默認值。這將確保他們首先註冊。

+0

假設您的應用程序委託沒有在MainMenu nib中實例化。如果是這樣,那麼這不是在加載筆尖之前。 – 2013-03-21 23:30:43

3

我通常在其使用的控制器對象的+initialize類方法中註冊默認值。 +initialize是在對象的生命週期中調用的最早的方法之一,因此它確保它們儘早註冊。

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