尝试插入非属性值的Objective C错误

21

你好,我正在尝试从一个餐厅对象中创建一个收藏列表。我的应用程序有不同的餐厅列表,我希望用户能够添加收藏餐厅的功能,但这段代码没有起作用。

- (IBAction)toggleFav:(id)sender {

    Restaurant *resto = [self restaure];

    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    [dic setObject:resto.price forKey:@"restoPrice"];
    [dic setObject:resto.restaurantId forKey:@"restaurantId"];
    [dic setObject:resto.restoAbout forKey:@"restoAbout"];
    [dic setObject:resto.restoAddress forKey:@"restoAddress"];
    [dic setObject:resto.restoBeverages forKey:@"restoBeverages"];
    [dic setObject:resto.restoCategory forKey:@"restoCategory"];
    [dic setObject:resto.restoEmail forKey:@"restoEmail"];
    [dic setObject:resto.restoLogo forKey:@"restoLogo"];
    [dic setObject:resto.restoName forKey:@"restoName"];
    [dic setObject:resto.restoPhone forKey:@"restoPhone"];
    [dic setObject:resto.restoCity forKey:@"restoCity"];

    NSArray *dicArray = [dic allKeys];


    if([sender isSelected]){
        //...
        [sender setSelected:NO];
        NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy];
        [array removeObject:dicArray];
        [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"];

    } else {
        //...
        [sender setSelected:YES];
        NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy];
        [array addObject:dicArray];
        [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"];
        [[NSUserDefaults standardUserDefaults] synchronize];

       //NSLog(@"%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"restoName"]);
  }
}

类别为 '__NSCFArray' 的对象。请注意,在属性列表中,字典和数组也必须仅包含属性值。


2
请检查您的字典中是否有空值。 - Exploring
2个回答

58

如果您不想麻烦地确保字典中的所有值都是属性列表类型,那么可以将字典简单地转换为NSData。

NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setObject:[NSKeyedArchiver archivedDataWithRootObject:self.myDictionary] forKey:@"MyData"];
[def synchronize];

要从沙盒中恢复到字典:

NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSData *data = [def objectForKey:@"MyData"];
NSDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];
self.myDictionary = [[NSDictionary alloc] initWithDictionary:retrievedDictionary];

希望这能帮助到某些人。 :D


附注:如果你得到的是可变字典或可变数组,请记得使用 "mutableCopy" 方法。否则,你无法在检索到的字典/数组中添加或删除对象。例如:

NSMutableDictionary *retrievedDictionary = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy];

或者

NSMutableArray *retrievedArray = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy];

4
谢谢,这帮了我省下了三次头疼。 - mmr
1
快速简单的解决方案。谢谢。 - user3344977

19

您只能在NSUserDefaults中存储属性列表类型(数组、数据、字符串、数字、日期、字典)或URL。 您需要将您的模型对象转换为这些类型。


3
你可以创建一个NSDictionary并将对象的所有属性放入其中。或者你可以实现NSCoding并使用它,这会类似一些(应该有很多文档可供参考;如果NSCoding无法找到文档,请搜索NSKeyedArchiver)。 - Catfish_Man
嗨,伙计,请看一下我上面的代码。我已经创建了一个数组,但仍然存在同样的问题。真不敢相信我已经尝试了三天了。关于编码方法,我不确定在哪里放置NSObject<NScoding>,因为我的detailView类实现了这个@interface DetailViewController :UIViewController。 - mavusane
你所创建的数组甚至不包含属性的值...只有它们的名称。至于NSCoding,听起来你需要去阅读一些关于协议的基础教程。你只需要声明符合NSCoding,而不涉及任何NSObject相关的内容。 - Catfish_Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接