如何创建和访问设置包中的数组元素
我想将字符串保存为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"];
感谢您的答复,但遗憾的是,似乎并没有工作。 mystrings的值仍然是0x0。另外,如果你有多个偏好项目,我不认为这个建议会起作用,因为关键的“值”不是唯一的。根据我迄今阅读过的文档的解释,关键字“我的标识符”应该是我应该指定为数据唯一键的那个。你可能走在正确的轨道上,但正如我所说,它没有奏效。 – JeffB6688 2011-05-07 19:50:04
@杰夫:钥匙是唯一的;这是一本字典。您可以使用任何您想要的作为键,@“我的标识符”,@“值”,@“黄色斑马”,但每个键只能有一个存在。你能澄清这个文件的位置吗?我认为这可能是你真正的问题。你指的是什么文档? – 2011-05-07 19:52:09
Root.plist是设置的一部分。捆绑在我的资源文件夹中。是的,我知道我需要指定一个唯一的密钥。当我在xcode下的Root.plist文件中创建首选项时,xcode会自动创建4个键(类型,标题,标识符和默认值),其中新项目是“标题”项目。您可以将“默认值”键更改为“值”键。当你这样做,它会创建一个项目键(你可以继续添加更多的项目)。对于Item键,您可以指定字符串值(例如“我的字符串1”)。我将继续进行下一个评论(限制尺寸)。 – JeffB6688 2011-05-07 20:35:25