2016-12-27 15 views
0

お客様のデータをNSUserDefaultsに保存しようとしています。私は上記のデータを保存するために、次のコードを使用しようと私の顧客NSMutableArrayをNSUserDefaultsのObjective-Cに保存するにはどうすればいいですか?

AvinLightInfo.h 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]; 

#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 

:顧客データは、以下のようなものです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' 

Objective-CためNSUserDefaultsで私の顧客NSMutableArrayを格納する方法は?

------------------------- EDIT -------------------- -----------

私はまた、以下の方法試してみてください。

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? 'NSMutableArrayの*配列= [[NSKeyedUnarchiver unarchiveObjectWithData:[デフォルトobjectForKey:;' "yourKey" @] mutableCopy]あなたの元_NSMutableArray_を取り戻すしたい場合は、言語=にObjC) そうで、検索は次のようになります。 – degapps

1

NSUserDefaultできるだけサポートするNSNumber(NSInteger、フロート、ダブル)、NSStringの、NSDate、NSArrayの、NSDictionaryの、BOOL、 だから、あなたは顧客データを保存したい場合は、顧客データをNSDataに変換し、顧客オブジェクトがNSCodingを実装し、encodeWithCoderとinitWithCoderをオーバーライドする必要があります。

そして、あなたのコードスタイルに注意してください、変数は小文字で始まります。

0

使用このサードパーティRMMApper

はretriveするために使用する

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

ストアに

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableArray *object = [defaults rm_customObjectForKey:@"key"]; 
関連する問題