更新 plist 字典中的布尔值

Posted

技术标签:

【中文标题】更新 plist 字典中的布尔值【英文标题】:Update Boolean Value in plist dictionary 【发布时间】:2012-06-15 17:06:20 【问题描述】:

我正在尝试更新 iphone 应用程序中 plist 字典中的布尔值。 plist 字典包含几个字符串和两个布尔值。以下是我当前的代码。

我先定义plist,然后定义NSMutableDictionary。运行下面的第三行代码时出现错误。

NSString *plistFile = [[NSBundle mainBundle] pathForResource:@"Property List" ofType:@"plist"];
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:plistFile];

[[dict objectForKey:@"Day 1"] setBool:TRUE forKey:@"Bookmarked"];

该错误突出显示下面的返回语句,并带有以下错误“线程 1:程序收到信号:“SIGABRT”

int main(int argc, char *argv[])
    @autoreleasepool   
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
     

您能提供的任何帮助将不胜感激。提前非常感谢。

【问题讨论】:

【参考方案1】:

仅仅因为dict 是可变的并不意味着它的子字典是可变的。 NSMutableDictionary 也没有 setBool:forKey: 方法。

NSMutableDictionary *subDict = [[dict objectForKey:@"Day 1"] mutableCopy];
[subDict setObject:[NSNumber numberWithBool:TRUE] forKey:@"Bookmarked"];
[dict setObject:subDict forKey:@"Day 1"];

【讨论】:

我在按钮单击事件中添加了这个新代码,代码不再崩溃,但包含 Bookmarked Boolean 的第 1 天字典没有更新为 TRUE 或 YES。我在运行应用程序时和关闭 iphone 模拟器后检查了 plist。 别忘了自动释放 mutableCopy 否则你会泄露它 @user1459279:你确定字典更新后plist被覆盖了吗? autorelease 是 arc 的错误。 plist 没有更新,只有字典,这是两个独立的实体,一个在内存中,一个在磁盘上。你不能使用 [NSBundle mainBundle] 来保存数据,只是为了访问它。 感谢您告知我无法永久修改 plist。【参考方案2】:

您可以修改 plist 文件的值,只要它不在包中即可。

在对象中声明布尔属性时,需要使用“布尔”而不是“布尔”。当您保存文件并尝试再次读取时,这将导致错误。

【讨论】:

以上是关于更新 plist 字典中的布尔值的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何编写字典对象的 plist 数组

在 plist 中处理持久布尔值的最佳方法?

使用 Swift,从 plist 加载数据时,如何区分布尔值和整数值?

在 perl 中使用 XPath 读取 Mac Plist 布尔值

关于将布尔文件写入 plist

从Angular 5中的子组件更新父布尔值