2012-11-24 61 views
1

我在使用NSUserDefaults的AppStore中已經有一個應用程序。其中一些默認設置是默認設置,我會在應用程序第一次啓動時進行設置,然後允許用戶稍後更改它們,如果他們希望的話。所以,在我的AppDelegate appDidFinishLaunchingWithOptions我把:NSUserDefaults Reset First Run

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

if (! [defaults boolForKey:@"notFirstRun"]) { 

    [defaults setBool:YES forKey:@"notFirstRun"]; 

    [defaults setInteger:0 forKey:@"verseKey"]; 
    [defaults synchronize]; 
} 

我現在有是我想在NSUserDefault類別中添加一些默認設置的問題,所以我想使它看起來像這樣:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

if (! [defaults boolForKey:@"notFirstRun"]) { 

    [defaults setBool:YES forKey:@"notFirstRun"]; 
    NSString *smalltitle = @"4"; 
    NSString *smallarticle = @"3"; 
    [defaults setObject:smalltitle forKey:@"Title"]; 
    [defaults setObject:smallarticle forKey:@"Article"]; 
    [defaults setInteger:0 forKey:@"verseKey"]; 
    [defaults synchronize]; 
} 

我知道這對於那些已經下載了應用程序的用戶來說會造成問題,並且只會更新它。他們不會運行該代碼,因爲notFirstRun布爾已經被設置爲YES。有關我應該在這裏做什麼的想法?

+3

請參閱http://stackoverflow.com/a/5397647/457406所有那些「firstRun」的東西是完全沒有必要的。 –

回答

0

製作新的notFirstRun布爾值(即notFirstRunTwo)。對於現有的用戶來說,這也是'不'。

+1

不知道是誰標記了這個答案,但是對於我的問題和我所描述的,這是最簡單的。 – user717452

+1

,並在您的應用程序的第10版中,您只需添加'notFirstRunTen'。正是由於這個問題,註冊默認值才更爲出色。另一件事是,通過註冊,您實際上可以更改現有用戶的默認值。使用'firstRun'方法,您永遠無法區分用戶設置的值和用戶未觸及的值。順便說一句,我沒有downvote。 –

+0

@MatthiasBauch只有當我經常添加需要設置新默認值的新功能時纔會發生這種情況。如果我不這樣做,所有新的更新只能用這兩個鍵。 – user717452

6

正確的解決方案是實際上不會使用默認值填充NSUserDefaults。而應使用registerDefaults:方法。

在應用程序啓動時你做:

NSUserDefaults *default = [NSUserDefaults standardUserDefaults]; 
[defaults registerDefaults:@{ 
    @"Title" : @"4", 
    @"Article" : @"3", 
    @"verseKey" : @0 
}]; 

就是這樣。每次運行應用程序時調用它。這些默認值實際上並未保留。只有在鍵值沒有明確的值時才返回該值。您可以在不影響任何現有值的情況下更新這些默認值。

+0

這應該是正確的答案,謝謝提及。 – Binarian

0

我建議做到以下幾點:

  • 用於存儲的應用程序版本檢查userdefaults如果它等於當前與否,如果沒有。
  • 商店目前的應用程序版本,並做首次推出初始化

    代碼

`

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *appVersion = [NSString stringWithFormat:@"%@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]]; 

if (! [defaults objectForKey:appVersion ]) 
{ 
    /// store the current version and then do your first run functions 
     [defaults setObject:[NSNumber numberWithInt:1] forKey:appVersion]; 
    /// here do your first run 
...... 
}`