2011-05-07 40 views
2

我想將字符串保存爲Settings.bundle Root.plist中的數組元素,並且能夠在後續啓動我的應用程序時從設置包中訪問這些字符串。我無法在任何地方找到一個很好的例子。在Xcode中,我創建了Root.plist,它看起來是這樣的:如何創建和訪問設置包中的數組元素

Key 
iPhone Setting Schema 
    Strings Filename 
    Preference Items 
     Item 0 (Title- My Title) 
      Type   Title 
      Title   My Title 
      Identifier  My Identifier 
      Values 
       Item 0  my string 1 
       Item 1  my string 2 
       Item 3  my string 3 

這將產生XML如下:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>StringsTable</key> 
<string>Root</string> 
<key>PreferenceSpecifiers</key> 
<array> 
    <dict> 
     <key>Type</key> 
     <string>PSTitleValueSpecifier</string> 
     <key>Title</key> 
     <string>My Title</string> 
     <key>Key</key> 
     <string>My Identifier</string> 
     <key>Values</key> 
     <array> 
      <string>my string 1</string> 
      <string>my string 2</string> 
      <string>my string 3</string> 
     </array> 
    </dict> 

我使用下面的代碼試圖價值觀從訪問標識符鍵「我的標識符」:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSArray *mystrings = [defaults arrayForKey:@"My Identifier"]; 
for (int i=0;i<3;i++) { 
    NSLog(@"%@", [mystrings objectAtIndex:i]); 
} 

在運行時,mystrings的值爲0。因此,「my string 1」,「my string 2」和「my string 3」的值不會被NSLog打印。

有人可以幫助我這個。另外,更新這些值的正確方法是什麼?你的問題的

回答

2

一部分的標題下,"Specifying Default Values for Preferences"提到:

從應用程序的設置默認首選項值束未設置直到設置應用程序運行。這意味着如果用戶在運行設置之前運行應用程序,則Settings Settings包中指定的默認值不可用。

所有的設置捆綁的東西中沒有加載你的應用程序的默認數據庫,直到後,用戶打開設置應用程序。這對你來說看起來很愚蠢嗎?對我來說似乎很愚蠢。結果是您需要首先註冊所有這些默認設置。我在試圖弄清楚發生了什麼的時候寫了這段代碼;改進可以確實地進行,但它應該讓你開始:

NSURL * settingsURL = [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"Settings" withExtension:@"bundle"]] 
         URLForResource:@"Root" withExtension:@"plist"]; 
NSDictionary * settingsDict = [NSDictionary dictionaryWithContentsOfURL:settingsURL]; 
NSArray * settingsArr = [settingsDict objectForKey:@"PreferenceSpecifiers"]; 
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
for(NSDictionary * setting in settingsArr){ 
    NSString * key = [setting objectForKey:@"Key"]; 
    if(!key) continue; // Some objects don't have keys 
    if(![defaults objectForKey:key]){ 
     [defaults setObject:[setting objectForKey:@"DefaultValue"] 
        forKey:key]; 
    } 
} 

,你必須是你當你[defaults objectForKey:@"myTitlePreferencesKey"]沒有得到一個數組PSTitleValueSpecifier鍵的另一個問題;你只需要一個字符串。 A @"DefaultValue"鍵/值對也需要成爲that item's dictionary的一部分。最初你會得到那個值,它必須是一個字符串。如果更改該值,則會從Titles陣列中獲取與Values陣列中該對象具有相同索引的字符串。我很確定,如果你有一個Values陣列,你還必須有一個Titles陣列。

對於你的問題的第二部分,如果你想改變任何首選項的值,你根本就

[[NSUserDefaults standardUserDefaults] setObject:myValue 
              forKey:@"myKey"]; 
+0

感謝您的答覆,但遺憾的是,似乎並沒有工作。 mystrings的值仍然是0x0。另外,如果你有多個偏好項目,我不認爲這個建議會起作用,因爲關鍵的「值」不是唯一的。根據我迄今閱讀過的文檔的解釋,關鍵字「我的標識符」應該是我應該指定爲數據唯一鍵的那個。你可能走在正確的軌道上,但正如我所說,它沒有奏效。 – JeffB6688 2011-05-07 19:50:04

+0

@傑夫:鑰匙是唯一的;這是一本字典。您可以使用任何您想要的作爲鍵,@「我的標識符」,@「值」,@「黃色斑馬」,但每個鍵只能有一個存在。你能澄清這個文件的位置嗎?我認爲這可能是你真正的問題。你指的是什麼文檔? – 2011-05-07 19:52:09

+0

Root.plist是設置的一部分。捆綁在我的資源文件夾中。是的,我知道我需要指定一個唯一的密鑰。當我在xcode下的Root.plist文件中創建首選項時,xcode會自動創建4個鍵(類型,標題,標識符和默認值),其中新項目是「標題」項目。您可以將「默認值」鍵更改爲「值」鍵。當你這樣做,它會創建一個項目鍵(你可以繼續添加更多的項目)。對於Item鍵,您可以指定字符串值(例如「我的字符串1」)。我將繼續進行下一個評論(限制尺寸)。 – JeffB6688 2011-05-07 20:35:25