2016-12-27 70 views
0

我正試圖將我的客戶數據存儲到NSUserDefaults。客戶的數據是這樣的:如何將我的客戶NSMutableArray存儲在Objective-C的NSUserDefaults中?

AvinLightInfo.h

#import <Foundation/Foundation.h> 
@interface AvinLightInfo : NSObject 

@property (nonatomic)uint16_t Address; 
@property (strong,nonatomic)NSString* name; 
@property (strong,nonatomic)NSMutableArray* ColorTempInfo; 
@property (strong,nonatomic)NSMutableArray* BrightnessInfo; 

@end 

view.m

NSMutableArray *AvinLightDataBase = [[NSMutableArray alloc] init]; 

AvinLightInfo *Avinlightinfo = [[AvinLightInfo alloc] init]; 
Avinlightinfo.Address = CFSwapInt16(0x3711); 
Avinlightinfo.name = @"TEST"; 

Avinlightinfo.ColorTempInfo = [[NSMutableArray alloc] init]; 
Avinlightinfo.BrightnessInfo = [[NSMutableArray alloc] init]; 
NSNumber* defaultValue = [NSNumber numberWithInt:200]; 
for(int j = 0 ; j < 4 ; j++){ 
    [Avinlightinfo.ColorTempInfo addObject:defaultValue]; 
    [Avinlightinfo.BrightnessInfo addObject:defaultValue]; 
} 
[AvinLightDataBase addObject:Avinlightinfo]; 

我嘗試使用下面的代碼來存儲上述數據NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:AvinLightDataBase forKey:@"AvinLightDataBase"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

但它崩潰,並顯示以下錯誤日誌:

2016-12-27 16:35:23.491723 MESH[2458:992363] [User Defaults] Attempt to set a non-property-list object (
    "<AvinLightInfo: 0x1702414a0>" 
) as an NSUserDefaults/CFPreferences value for key AvinLightDataBase 
2016-12-27 16:35:23.492929 MESH[2458:992363] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
    "<AvinLightInfo: 0x1702414a0>" 
) for key AvinLightDataBase' 

如何在我的客戶NSUserDefaults存儲NSMutableArrayObjective-C

-------------------------編輯-------------------- -----------

我也試試下面的方法:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:AvinLightDataBase]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:data forKey:@"light"]; 
[defaults synchronize]; 

但它崩潰,錯誤日誌是:

-[AvinLightInfo encodeWithCoder:]: unrecognized selector sent to instance 0x17405c8c0 
2016-12-27 17:20:54.203510 MESH[2481:998134] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AvinLightInfo encodeWithCoder:]: unrecognized selector sent to instance 0x17405c8c0' 
*** First throw call stack: 
+0

http://stackoverflow.com/questions/19720611/attempt-to-set-a -non-property-list-object-as-an-nsuserdefaults – aNa12

回答

1

您可以存儲陣列通過以下方式自定義對象

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:data forKey:@"yourKey"]; 


NSArray *array= [NSKeyedUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"yourKey"]; 

更多的細節,你可以按照本Archiving Objective-C Objects with NSCoding

+0

嗨,我試着在上面編輯,但它崩潰了。我錯過了什麼嗎? – Wun

+0

你是否實現了initWithCode方法? –

+0

請注意,即使將可變對象設置爲值,「從NSUserDefaults返回的值也是不可變的。」 [Apple Docs](https://developer.apple.com/reference/foundation/nsuserdefaults?語言= objc) 所以,如果你想找回原來的_NSMutableArray_,檢索應該是這樣的: '的NSMutableArray *陣列= [[NSKeyedUnarchiver unarchiveObjectWithData:默認objectForKey:@ 「yourKey」] mutableCopy]'。 – degapps

1

NSUserDefault只能支持的NSNumber(NSInteger的,浮動,雙),的NSString,NSDate的,的NSArray,NSDictionary的,BOOL, 所以,如果你想存儲客戶數據,您應該將客戶數據轉換爲NSData,並且您的客戶對象必須實現NSCoding,並覆蓋encodeWithCoder和initWithCoder。

然後,請注意您的代碼風格,變量將以小寫字母開頭。

0

使用此第三方RMMApper

要保存使用

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
[defaults rm_setCustomObject:AvinLightDataBase forKey:@"key"]; 

以檢索

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableArray *object = [defaults rm_customObjectForKey:@"key"]; 
相關問題