• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iphone - 写入 plist 字典中的字符串

[复制链接]
菜鸟教程小白 发表于 2022-12-12 22:28:09 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我使用的 plist 结构如下:plist, array, dict key string key string/dict, dict key string key string/dict,/array,/plist.

我想要使用以下代码将当前字典中的“完成”字符串的值设置为"is"。

但是现在,代码用当前字典的字符串替换了整个字典数组(不过,“完成”键的值应该是"is"。)

什么是我想要的正确代码?

在 DetailViewController.m 中:

-(IBAction)favoriteButtonPressedid)sender
{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent"Object.plist"];


[[detailsDataSource objectAtIndex: detailIndex] setValue"Yes" forKey"Done"];
[[detailsDataSource objectAtIndex: detailIndex] writeToFile:path atomically:YES];
}

detailsDataSource 和 detailIndex 是从 TableViewController.m segue 收到的。

TableViewController.m segue 部分:

    detailViewController.detailsDataSource = [[NSArray alloc]initWithArraybjectsArray];
    detailViewController.detailIndex = selectedRowIndex.row;

DetailViewController viewDidLoad

if ([[[detailsDataSource objectAtIndex: detailIndex] valueForKey"Favorite"] isEqual"Yes"])  {

    [favoriteButton setImage:[UIImage imageNamed"favoritedItem.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
 }


districtLabel.text = [[detailsDataSource objectAtIndex: detailIndex] valueForKey"District"];

detailsDataSource 数组在 detailViewController 中像这样使用,所以我不能从数组更改为字典,在这种情况下必须制作一个可变副本。



Best Answer-推荐答案


setValue:forKey 不用于修改可变字典。您应该使用 setObject:forKey。即,这个:

[[detailsDataSource objectAtIndex: detailIndex] setValue"Yes" forKey"Done"];

应该是:

[[detailsDataSource objectAtIndex: detailIndex] setObject"Yes" forKey:@"Done"];

如果这不能解决问题,请确保字典和数组都是可变的:

-(IBAction)favoriteButtonPressedid)sender {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Object.plist"];

    NSMutableDictionary *mutDict = [NSMutableDictionary dictionaryWithDictionary:[detailsDataSource objectAtIndex:detailIndex]];
    [mutDict setObject:@"Yes" forKey:@"Done"];

    NSMutableArray *tmpMutArr = [NSMutableArray arrayWithArray:detailsDataSource];
    [tmpMutArr replaceObjectAtIndex:detailIndex withObject:[NSDictionary dictionaryWithDictionary:mutDict]];  // make dict immutable before replacing.  Casting it ( (NSDictionary *)mutDict ) works too.

    [detailsDataSource release], detailsDataSource = nil;
    detailsDataSource = [[NSArray alloc] initWithArray:tmpMutArr];

    [detailsDataSource writeToFile:path atomically:YES];
}

另外,您可以使用 [NSNumber numberWithBool:YES] 代替 @"Yes":
[mutDict setObject:[NSNumber numberWithBool:YES] forKey:@"Done"];
通常会比使用 @"Yes" 更好。

还有:

districtLabel.text = [[detailsDataSource objectAtIndex: detailIndex] valueForKey:@"Yes"];

应该是:

districtLabel.text = [[detailsDataSource objectAtIndex: detailIndex] objectForKey:@"Yes"];

还注意到您可能存在内存泄漏:

detailViewController.detailsDataSource = [[NSArray alloc] initWithArraybjectsArray];

确保在使用保留的属性 setter 时自动释放。

关于iphone - 写入 plist 字典中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923593/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap