दिलचस्प पोस्ट
एक एकल कार्रवाई के साथ कई फाइलें डाउनलोड करें 'और' बनाम '&&' ऑपरेटर के रूप में लॉलीपॉप में ऐप मैच करने के लिए स्टेटस बार का रंग कैसे बदल सकता है? AngularJS एनजी-क्लिक रोकप्रोग्रामेशन मैं जावा अंतरफलक में एक स्थिर विधि को परिभाषित क्यों नहीं कर सकता? वापसी कुंजी के साथ UITextView के लिए कीबोर्ड को कैसे खारिज करें? DLL 'SQLite.Interop.dll' लोड करने में असमर्थ मैं अपने सी # कार्यक्रम के एक पैनल के भीतर एक और अनुप्रयोग कैसे चला सकता हूँ? सी ++ में, आभासी आधार वर्ग क्या है? JavaScript में उदाहरण ऑपरेटर क्या है? क्लास फील्ड क्यों नहीं हो सकते? Json.NET कैश प्रकार 'serialization जानकारी है? कैसे एक सरणी सूची का उपयोग करने के लिए? Chrome स्थानीय jQuery कुकीज़ क्यों अनदेखा करता है? व्यावहारिक गैर-छवि आधारित कैप्चा दृष्टिकोण क्या है?

NSUserDefaults में कस्टम ऑब्जेक्ट्स को कैसे स्टोर करें

ठीक है, इसलिए मैं कुछ पोकिंग कर रहा हूं, और मुझे मेरी समस्या का एहसास है, लेकिन मुझे नहीं पता कि यह कैसे ठीक करें। मैंने कुछ डेटा रखने के लिए एक कस्टम क्लास बनाया है मैं इस वर्ग के लिए ऑब्जेक्ट्स बना रहा हूं, और मुझे सत्रों के बीच में रहने के लिए उन्हें ज़रूरत है इससे पहले कि मैं अपनी सारी जानकारी NSUserDefaults में डाल रहा था, लेकिन यह काम नहीं कर रहा है

 -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'. 

यही त्रुटि संदेश मुझे मिलता है जब मैं अपना कस्टम वर्ग, "प्लेयर" डालता हूं, NSUserDefaults अब, मैंने पढ़ा है कि जाहिरा तौर पर NSUserDefaults केवल कुछ प्रकार की जानकारी संग्रहीत करता है I तो मैं NSUSerDefaults में अपनी वस्तुओं कैसे प्राप्त कर सकता हूं?

मैंने पढ़ा है कि मेरे कस्टम ऑब्जेक्ट को "सांकेतिक शब्दों में बदलना" करने का एक तरीका होना चाहिए और फिर इसे डाल देना चाहिए, लेकिन मुझे यकीन नहीं है कि इसे कैसे कार्यान्वित करें, मदद की सराहना होगी! धन्यवाद!

**** संपादित ****

ठीक है, इसलिए मैंने नीचे दिए गए कोड के साथ काम किया (धन्यवाद!), लेकिन मुझे अभी भी कुछ समस्याएं आ रही हैं असल में, कोड अब क्रैश हो जाता है और मुझे यकीन नहीं है कि क्यों, क्योंकि यह कोई त्रुटि नहीं देता है शायद मुझे कुछ मूलभूत याद आ रही है और मैं बहुत थक गया हूँ, लेकिन हम देखेंगे। यहां मेरा कस्टम क्लास, "प्लेयर" का कार्यान्वयन है:

 @interface Player : NSObject { NSString *name; NSNumber *life; //Log of player's life } //Getting functions, return the info - (NSString *)name; - (int)life; - (id)init; //These are the setters - (void)setName:(NSString *)input; //string - (void)setLife:(NSNumber *)input; //number @end 

कार्यान्वयन फ़ाइल:

 #import "Player.h" @implementation Player - (id)init { if (self = [super init]) { [self setName:@"Player Name"]; [self setLife:[NSNumber numberWithInt:20]]; [self setPsnCounters:[NSNumber numberWithInt:0]]; } return self; } - (NSString *)name {return name;} - (int)life {return [life intValue];} - (void)setName:(NSString *)input { [input retain]; if (name != nil) { [name release]; } name = input; } - (void)setLife:(NSNumber *)input { [input retain]; if (life != nil) { [life release]; } life = input; } /* This code has been added to support encoding and decoding my objecst */ -(void)encodeWithCoder:(NSCoder *)encoder { //Encode the properties of the object [encoder encodeObject:self.name forKey:@"name"]; [encoder encodeObject:self.life forKey:@"life"]; } -(id)initWithCoder:(NSCoder *)decoder { self = [super init]; if ( self != nil ) { //decode the properties self.name = [decoder decodeObjectForKey:@"name"]; self.life = [decoder decodeObjectForKey:@"life"]; } return self; } -(void)dealloc { [name release]; [life release]; [super dealloc]; } @end 

तो यह मेरी कक्षा है, बहुत सीधे आगे, मुझे पता है कि यह मेरी वस्तुओं को बनाने में काम करता है तो यहां AppDelegate फ़ाइल का प्रासंगिक हिस्सा है (जहां मैं एन्क्रिप्शन और डिक्रिप्ट फ़ंक्शन कॉल करता हूं):

 @class MainViewController; @interface MagicApp201AppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; MainViewController *mainViewController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) MainViewController *mainViewController; -(void)saveCustomObject:(Player *)obj; -(Player *)loadCustomObjectWithKey:(NSString*)key; @end 

और फिर कार्यान्वयन फ़ाइल का महत्वपूर्ण भाग:

  #import "MagicApp201AppDelegate.h" #import "MainViewController.h" #import "Player.h" @implementation MagicApp201AppDelegate @synthesize window; @synthesize mainViewController; - (void)applicationDidFinishLaunching:(UIApplication *)application { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; //First check to see if some things exist int startup = [prefs integerForKey:@"appHasLaunched"]; if (startup == nil) { //Make the single player Player *singlePlayer = [[Player alloc] init]; NSLog([[NSString alloc] initWithFormat:@"%@\n%d\n%d",[singlePlayer name], [singlePlayer life], [singlePlayer psnCounters]]); // test //Encode the single player so it can be stored in UserDefaults id test = [MagicApp201AppDelegate new]; [test saveCustomObject:singlePlayer]; [test release]; } [prefs synchronize]; } -(void)saveCustomObject:(Player *)object { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:object]; [prefs setObject:myEncodedObject forKey:@"testing"]; } -(Player *)loadCustomObjectWithKey:(NSString*)key { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSData *myEncodedObject = [prefs objectForKey:key ]; Player *obj = (Player *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject]; return obj; } 

Eeee, सभी कोड के बारे में क्षमा करें। बस मदद करने का प्रयास कर रहा हूं। असल में, ऐप लांच होगा और फिर तुरन्त दुर्घटना होगा मैंने इसे ऐप के एन्क्रिप्शन भाग में संकुचित किया है, जहां वह क्रैश करता है, इसलिए मैं कुछ गलत कर रहा हूं लेकिन मुझे यकीन नहीं है कि क्या हुआ। मदद की सराहना की जाएगी, धन्यवाद!

(मुझे अभी तक डिक्रिप्ट करने के लिए आसपास नहीं मिला है, क्योंकि मुझे अभी तक एन्क्रिप्ट करने का काम नहीं मिला है।)

वेब के समाधान से एकत्रित समाधान "NSUserDefaults में कस्टम ऑब्जेक्ट्स को कैसे स्टोर करें"

अपने प्लेयर क्लास पर, निम्न दो विधियों को कार्यान्वित करें (अपने स्वयं के ऑब्जेक्ट से प्रासंगिक कुछ के साथ एन्कोड ऑब्जेक्ट के लिए कॉलों को प्रतिस्थापित करना):

 - (void)encodeWithCoder:(NSCoder *)encoder { //Encode properties, other class variables, etc [encoder encodeObject:self.question forKey:@"question"]; [encoder encodeObject:self.categoryName forKey:@"category"]; [encoder encodeObject:self.subCategoryName forKey:@"subcategory"]; } - (id)initWithCoder:(NSCoder *)decoder { if((self = [super init])) { //decode properties, other class vars self.question = [decoder decodeObjectForKey:@"question"]; self.categoryName = [decoder decodeObjectForKey:@"category"]; self.subCategoryName = [decoder decodeObjectForKey:@"subcategory"]; } return self; } 

NSUserDefaults से पढ़ना और लिखना:

 - (void)saveCustomObject:(MyObject *)object key:(NSString *)key { NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:encodedObject forKey:key]; [defaults synchronize]; } - (MyObject *)loadCustomObjectWithKey:(NSString *)key { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *encodedObject = [defaults objectForKey:key]; MyObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject]; return object; } 

कोड से बेमानी रूप से उधार लिया गया: nsuserdefaults में बचत वर्ग

मैं कस्टम ऑब्जेक्ट को NSUserDefaults में आसान और अधिक सुविधाजनक से बचाने में मदद करने के लिए एक पुस्तकालय आरएम मैपर ( https://github.com/roomorama/RMMapper ) बना रहा हूं, क्योंकि एनकोडविथकोडर और initWithCoder को कार्यान्वयन सुपर उबाऊ है!

अभिलेखीय वर्ग को चिह्नित करने के लिए, बस का प्रयोग करें: #import "NSObject+RMArchivable.h"

NSUserDefaults में एक कस्टम ऑब्जेक्ट को सहेजने के लिए:

 #import "NSUserDefaults+RMSaveCustomObject.h" NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults rm_setCustomObject:user forKey:@"SAVED_DATA"]; 

NSUserDefaults से कस्टम obj प्राप्त करने के लिए:

 user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 

यदि कोई भी एक त्वरित संस्करण की तलाश कर रहा है:

1) अपने डेटा के लिए एक कस्टम क्लास बनाएं

 class customData: NSObject, NSCoding { let name : String let url : String let desc : String init(tuple : (String,String,String)){ self.name = tuple.0 self.url = tuple.1 self.desc = tuple.2 } func getName() -> String { return name } func getURL() -> String{ return url } func getDescription() -> String { return desc } func getTuple() -> (String,String,String) { return (self.name,self.url,self.desc) } required init(coder aDecoder: NSCoder) { self.name = aDecoder.decodeObjectForKey("name") as! String self.url = aDecoder.decodeObjectForKey("url") as! String self.desc = aDecoder.decodeObjectForKey("desc") as! String } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(self.name, forKey: "name") aCoder.encodeObject(self.url, forKey: "url") aCoder.encodeObject(self.desc, forKey: "desc") } } 

2) डेटा को बचाने के लिए निम्नलिखित फ़ंक्शन का उपयोग करें:

 func saveData() { let data = NSKeyedArchiver.archivedDataWithRootObject(custom) let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(data, forKey:"customArray" ) } 

3) पुनः प्राप्त करने के लिए:

 if let data = NSUserDefaults.standardUserDefaults().objectForKey("customArray") as? NSData { custom = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [customData] } 

नोट: यहां मैं कस्टम श्रेणी ऑब्जेक्ट्स की एक सरणी को सहेज रहा हूं और पुनः प्राप्त कर रहा हूं।

@ क्रिसिस का उत्तर लेते हुए और इसके साथ चल रहे, यह कोड NSUserDefaults पर एक अच्छी श्रेणी में कार्यान्वित किया जा सकता है ताकि कस्टम ऑब्जेक्ट को बचाया जा सके और पुनर्प्राप्त किया जा सके।

 @interface NSUserDefaults (NSUserDefaultsExtensions) - (void)saveCustomObject:(id<NSCoding>)object key:(NSString *)key; - (id<NSCoding>)loadCustomObjectWithKey:(NSString *)key; @end @implementation NSUserDefaults (NSUserDefaultsExtensions) - (void)saveCustomObject:(id<NSCoding>)object key:(NSString *)key { NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object]; [self setObject:encodedObject forKey:key]; [self synchronize]; } - (id<NSCoding>)loadCustomObjectWithKey:(NSString *)key { NSData *encodedObject = [self objectForKey:key]; id<NSCoding> object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject]; return object; } @end 

उपयोग:

 [[NSUserDefaults standardUserDefaults] saveCustomObject:myObject key:@"myKey"]; 

उस डेटा / ऑब्जेक्ट को सिंक्रनाइज़ करें जिसे आपने NSUserDefaults में सहेजा है

 -(void)saveCustomObject:(Player *)object { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:object]; [prefs setObject:myEncodedObject forKey:@"testing"]; [prefs synchronize]; } 

आशा है कि यह आपकी मदद करेगा। धन्यवाद

स्विफ्ट 3

 class MyObject: NSObject, NSCoding { let name : String let url : String let desc : String init(tuple : (String,String,String)){ self.name = tuple.0 self.url = tuple.1 self.desc = tuple.2 } func getName() -> String { return name } func getURL() -> String{ return url } func getDescription() -> String { return desc } func getTuple() -> (String, String, String) { return (self.name,self.url,self.desc) } required init(coder aDecoder: NSCoder) { self.name = aDecoder.decodeObject(forKey: "name") as? String ?? "" self.url = aDecoder.decodeObject(forKey: "url") as? String ?? "" self.desc = aDecoder.decodeObject(forKey: "desc") as? String ?? "" } func encode(with aCoder: NSCoder) { aCoder.encode(self.name, forKey: "name") aCoder.encode(self.url, forKey: "url") aCoder.encode(self.desc, forKey: "desc") } } 

स्टोर और पुनः प्राप्त करने के लिए:

 func save() { let data = NSKeyedArchiver.archivedData(withRootObject: object) UserDefaults.standard.set(data, forKey:"customData" ) } func get() -> MyObject? { guard let data = UserDefaults.standard.object(forKey: "customData") as? Data else { return nil } return NSKeyedUnarchiver.unarchiveObject(with: data) as? MyObject }