我想将字符串保存为Settings.bundle Root.plist中的数组元素,并且能够在我的应用程序的后续启动时从Setting包中访问这些字符串。我无法在任何地方找到一个好的例子。在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。因此,NSLog不会打印“my string 1”,“my string 2”和“my string 3”的值。
有人可以帮我解决这个问题。另外,更新这些值的正确方法是什么?
答案 0 :(得分:2)
部分问题在标题"Specifying Default Values for Preferences"下提及:
在设置应用程序运行之前,不会设置应用程序的“设置”包中的默认首选项值。这意味着如果用户在运行“设置”之前运行您的应用程序,则“设置”包中指定的默认值将不可用。
在用户打开设置应用程序之后 之前,设备包中的所有内容都不会加载到您应用的默认数据库中。这对你来说真的很蠢吗?对我来说似乎很愚蠢。结果是您需要自己初始注册所有这些默认值。在我试图弄清楚发生了什么的时候,我写了这个;绝对可以改进,但它应该让你开始:
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];
}
}
您遇到的另一个问题是,PSTitleValueSpecifier
时,您没有获得[defaults objectForKey:@"myTitlePreferencesKey"]
个键的数组;你只得到一个字符串。 @"DefaultValue"
键/值对也必须是that item's dictionary的一部分。最初,您将获得该值,该值必须是字符串。如果更改该值,您将从Titles
数组中获取与Values
数组中该对象具有相同索引的字符串。我很确定如果你有Values
数组,你还必须有一个Titles
数组。
对于问题的第二部分,如果您想更改任何偏好的值,您只需执行
[[NSUserDefaults standardUserDefaults] setObject:myValue
forKey:@"myKey"];