【问题标题】:Attempt to insert non-property value Objective C尝试插入非属性值目标 C
【发布时间】:2013-04-07 00:09:16
【问题描述】:

您好,我正在尝试从一个餐厅对象创建一个fourates 列表,我的应用程序有一个不同餐厅的列表,我希望用户能够添加最喜欢的餐厅,但此代码不起作用

- (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' 类的

'。请注意,属性列表中的字典和数组也必须只包含属性值。

【问题讨论】:

  • 检查你的字典是否有空值?

标签: ios objective-c nsmutablearray nsuserdefaults property-list


【解决方案1】:

如果您不想费心确保所有字典值都是属性列表类型,那么您可以简单地将字典转换为 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];

【讨论】:

  • 谢谢,这让我免了头三个头疼。
  • 快速简单的解决方案。谢谢。
【解决方案2】:

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

【讨论】:

  • 例如,您可以创建一个 NSDictionary 并将对象的所有属性放入其中。或者你可以实现 NSCoding 并使用它,它会是相似的(应该有很多文档;如果 NSCoding 没有找到它们,请搜索 NSKeyedArchiver)
  • 嗨,伙计,看到我上面的代码我已经创建了一个数组,但仍然是同样的问题,不敢相信它花了整整 3 天的时间来尝试这个,使用编码方法我不确定在哪里放置 NSObject 因为我的 detailView 类实现了这个 @interface DetailViewController :UIViewController
  • 您创建的数组甚至不包含您的属性的值...只是它们的名称。至于 NSCoding,听起来您需要阅读有关协议的基本教程。你只需要声明与 NSCoding 的一致性,而不是任何涉及 NSObject 的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多