从数组(plist)中删除字典元素 Cocoa Touch

Posted

技术标签:

【中文标题】从数组(plist)中删除字典元素 Cocoa Touch【英文标题】:Delete dictionary element from array (plist) Cocoa Touch 【发布时间】:2011-03-03 19:55:31 【问题描述】:

大家好, 我有这个列表:

    <plist version="1.0">
    <dict>
        <key>Rows</key>
        <array>
            <dict>
                <key>FavTitle</key>
                <string>Book1</string>
                <key>Favourited</key>
                <string>duh</string>
                <key>SaveName</key>
                <string>book1.pdf</string>
            </dict>
            <dict>
                <key>FavTitle</key>
                <string>Book2</string>
                <key>Favourited</key>
                <string>duh</string>
                <key>SaveName</key>
                <string>book2.pdf</string>
            </dict>
        </array>
    </dict>
    </plist>

这样填充我的 UITableView:

cell.text = [dictionary objectForKey:@"FavTitle"];

(是的,这是贬值了)当一个单元格被选中时,我的字典对象被推送到我的详细视图(例如设置标题和 UIWebView url),如下所示:

NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
        DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
        dvController.selectedSaveName = [dictionary objectForKey:@"SaveName"];
        dvController.selectedFavTitle = [dictionary objectForKey:@"FavTitle"];
        dvController.selectedFavourited = [dictionary objectForKey:@"Favourited"];
        [dvController setHidesBottomBarWhenPushed:YES];

        [self.navigationController pushViewController:dvController animated:YES];


        [dvController release];

这一切都很好,我可以添加到该数组中,但是如何从中获取当前加载的字典?这不起作用:

NSString *documentsDirectory = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents/"]];
    NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"];
    NSMutableDictionary *rootDict = [[NSMutableDictionary alloc] initWithContentsOfFile:writablePath];
    NSMutableDictionary *thisFav = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"duh", @"Favourited",
                                  selectedSaveName, @"SaveName",
                                  selectedFavTitle, @"FavTitle",
                                  nil];
    [[rootDict objectForKey:@"Rows"] removeObject:thisFav];      
    [rootDict writeToFile:writablePath atomically: YES];

如何删除包含字符串“Book2”的条目?我发布的最后一个 sn-p 不起作用!谢谢大家!

【问题讨论】:

澄清:您想从 plist 中删除字典?例如。您必须输入:Book1 和 Book2,并且要删除 Book2。否则,问题根本就不清楚。 你说得对!现在编辑它,抱歉缺乏澄清,谢谢你指出那个人! 【参考方案1】:

你没有说你得到了什么错误,如果有的话。但是,您的问题可能与可变性有关。

当您使用 initWithContentsOfFile 在 plist 中读取 NSMutableDictionary 时,只有***字典本身是可变的,任何嵌套容器都是不可变的 - 在您的情况下,Rows 数组将是不可变的。

要使整个事情可变,您需要使用NSPropertyListSerialization 中的propertyListFromData:mutabilityOption:format:errorDescription: 传入NSPropertyListMutableContainersNSPropertyListMutableContainersAndLeaves 作为可变选项。

【讨论】:

我认为问题不在于它的可变性,而在于它在做什么,我认为我只能创建一个新对象,然后删除该新创建的对象而不将其放入 NSMutableDictionary! 我的立场是正确的,不应该相信文档——嵌套数组是可写的。并且刚刚运行它确实删除条目的代码。所以你还有其他问题。 writeToFile: 返回什么,是还是否?

以上是关于从数组(plist)中删除字典元素 Cocoa Touch的主要内容,如果未能解决你的问题,请参考以下文章

plist、数组和字典的元素之间有啥关系?

iOS开发,如何替换plist这个数组下数据

从 plist 中获取数组中的字典对象的问题

使用循环从 plist 的根级别获取字典数组并将其放入变量中

从 Plist 中提取数据到数组和字典

想要从 iPhone 的 plist 中的字典数组中获取数据? [复制]