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

时间:2011-05-07 19:11:16

标签: objective-c xcode ios

我想将字符串保存为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”的值。

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

1 个答案:

答案 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"];