如何创建和访问设置包中的数组元素

问题描述:

我想将字符串保存为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打印。

有人可以帮助我这个。另外,更新这些值的正确方法是什么?你的问题的

一部分的标题下,"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