2013-04-07 39 views
18

您好,我正在尝试从一家餐馆创建一个Fourates列表对象,我的应用程序拥有不同餐馆的列表,我希望用户添加优惠餐厅的功能,并且此代码是不工作尝试插入非财产价值Objective C

- (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 2013-04-10 07:45:16

回答

17

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

+0

我该怎么做,对不起 – mavusane 2013-04-07 09:05:04

+3

例如,您可以创建一个NSDictionary并将对象的所有属性放在其中。或者你可以实现NSCoding并使用它,它会是类似的(应该是大量的文档;搜索NSKeyedArchiver,如果NSCoding没有找到它们) – 2013-04-07 17:04:44

+0

你好队友看到我的代码上面我已经创建了一个数组,但仍然是同样的问题,不能相信它的3整天试图这样做,用编码方法我不知道在哪里把NSObject ,因为我的detailView类实现了这个@interface DetailViewController:UIViewController – mavusane 2013-04-07 23:40:13

57

如果你不想理会确保您所有的字典中的值是属性列表类型,那么你可以简单地转换成字典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 2014-02-18 20:47:35

+1

快速简单的解决方案。谢谢。 – user3344977 2014-03-27 05:16:50

+2

这应该被接受..感谢很多@Rocotilos。 – TamilKing 2015-10-13 07:18:57