从NSUserDefaults中的特定密钥中提取

时间:2014-02-25 17:05:25

标签: ios nsuserdefaults

以下代码将值保存到多个NSUserDefaults,其中文件名是从存储在.plist中的字符串生成的(例如'storedbook1','storedbook2',其中存储在.plist中的字符串是'book1', 'book2'等)。但是,我只希望一次定位一个NSUserDefault。如何修改代码具体? (例如,如果我想给'storedbook20'赋值3)。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory =  [paths objectAtIndex:0];
NSString *myListPath = [documentsDirectory stringByAppendingPathComponent:@"books.plist"];
tableData = [[NSArray alloc]initWithContentsOfFile:myListPath];

for (NSDictionary* dict in tableData) {
    NSString *key = [NSString stringWithFormat:@"stored%@", dict[@"filename"]];
    [standardUserDefaults setObject:[NSNumber numberWithInt:5] forKey: key];
    [standardUserDefaults synchronize];
}

示例.plist

<array>
    <dict>
        <key>title</key>
        <string>title1</string>
        <key>filename</key>
        <string>book1</string>
    </dict>
    <dict>
        <key>title</key>
        <string>title2</string>
        <key>filename</key>
        <string>book2</string>
    </dict>
</array>

使用以下代码显示,当我只想一次将5的值添加到一个时,storebook1和storedbook2的值都增加了5(实际的.plist中有两个以上的项目): / p>

NSNumber *checkednew = 0;
checkednew = [standardUserDefaults objectForKey: key];
int checknew = [checkednew intValue];

NSLog(@"%@", key);
NSLog(@"%d", checknew);

密钥的输出是:

storedbook1 五 storedbook2 5

2 个答案:

答案 0 :(得分:0)

它们是没有键的值所以如果你想要没有值重复,你可以使用全局cont属性,并在向NSUserDefaults添加新对象时添加+1

for (NSDictionary* dict in tableData) {
        NSString *key = [NSString stringWithFormat:@"stored%@", dict[@"check"]];
        [standardUserDefaults setObject:[NSNumber numberWithInt:cont] forKey: key];
        [standardUserDefaults synchronize];
        cont++;

        ...
}

为了控制您的号码,您可以在保存后将此号码保存在NSUserDefaults中

[standardUserDefaults setObject:[NSNumber numberWithInt:cont] forKey: @"ContValues"];

答案 1 :(得分:0)

当您阅读plist文件时,将获取的密钥名称存储到字典中(而不是保存在NSUserDefaults中)。当您收到用户操作时,从该字典中获取您的密钥名称(storedbookx)并将值保存到NSUserDefaults。这将节省大量的i / o和迭代操作。