2011-01-30 217 views
4

我剛開始使用偏好設置窗格讓用戶自定義iOS應用程序中的某些設置,創建Settings.bundle並從中訪問信息非常簡單。我的問題是我在蘋果文檔閱讀的設置應編程初始化:初始化iPhone應用程序默認值的位置

建議你除了程序在啓動時註冊所有默認的值,包括他們在您的設置綁定屬性列表。對於新安裝的應用程序,在設置應用程序運行之前,應用程序設置包中的默認首選項值不會被設置。這意味着如果用戶在運行設置前運行應用程序,則設置包中指定的默認值將不可用。 在啓動時以編程方式設置這些值可確保您的應用程序始終具有適當的值。要以編程方式註冊默認值,請使用NSUserDefaults類的registerDefaults:方法。

在應用程序中的哪裏進行了初始化,我怎樣才能確定我不覆蓋用戶提供的值?這是用App Delegate的某種方法處理的嗎?

回答

11

在嘗試訪問存儲在NSUserDefaults中的值之前,您應該註冊默認值。 你可以在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
註冊您的默認值很快,所以不需要優化。只需在應用程序啓動時執行此操作即可。

我存儲我的userdefaults在plist中並註冊該列表的內容,就像這樣:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

如果您註冊默認這樣你就不必擔心您覆蓋用戶提供的值。 NSUserdefaults使用「域」來存儲它的值。如果您註冊了默認值,它們將存儲在註冊域中。如果用戶存儲值,則這些值將存儲在應用程序域中。

如果您嘗試從NSUserdefaults中獲取值,它會查看該值是否存在於應用程序域中,如果不存在,則會從註冊域獲取該值。


編輯:

plist editor

(如果沒有用戶提供的值或者更好的,存儲在您的NSUserDefaults的價值觀,以及那些作爲後備),您會訪問那些值一樣這個:

NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait"; 
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"]; 

plist只是NSDictionary的鍵和值的另一種表示。關鍵是您用於訪問userdefaults的鍵,並且該值是您的默認值。 非常直截了當。
你如何創建詞典並不重要。你也可以在代碼中做到這一點。

+0

所以會說的plist是什麼樣子?只是一組與關聯名稱關聯的鍵/值對?如果代碼位於` - (void)applicationDidFinishLaunching:(UIApplication *)application`中,還是必須位於` - (BOOL)應用程序中:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions` for一些原因? – 2011-01-31 19:34:16

0

您可以用同樣的方法應用程序委託裏面,你用它來設置你的初始窗口,didFinishLaunchingWithOptions:

但是,您可能還需要內部applicationWillEnterForeground一些邏輯:,因爲潛在的用戶可以把你的應用程序進入背景,更改設置應用程序內的設置,然後恢復您的應用程序,並期望這些更改已被應用。

1

由於@fluchtpunkt建議,您可以使用註冊的默認值:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

就個人而言,我檢查我的應用程序代表各自獨立的價值。

#define kSettings [NSUserDefaults] 
if([kSettings boolForKey:@"firstRun"] == nil){ 

    // 
    // Set up the initial settings... 
    // 


    [kSettings setBool:NO forKey:@"firstRun"]; 
} 

我寫了一個「重置」方法,然後在第一次運行時調用它。我更喜歡在代碼中這樣做,但理論上你可以使用plist。我只是覺得這是一個出錯的地方。

0

@MatthiasBauch或@ Moshe的答案很可能適用於大多數人,但對於任何喜歡我在Root.plist文件中設置的人(我使用的是InAppSettingsKit),您必須深入瞭解一下特定的plist文件來獲取設置的實際默認值(因爲它們不在plist的頂層,但嵌套在鍵盤PreferenceSpecifiers下)。這裏是另一種答案的鏈接在這裏,包含額外的代碼爲我工作:

https://stackoverflow.com/a/10497898/381233