ঠিক আছে, তাই আমি কিছুটা ঘুরে বেড়াচ্ছি, এবং আমি আমার সমস্যাটি বুঝতে পারি, তবে কীভাবে এটি ঠিক করতে হয় তা আমি জানি না। আমি কিছু তথ্য ধরে রাখতে একটি কাস্টম ক্লাস করেছি। আমি এই শ্রেণীর জন্য অবজেক্ট তৈরি করি এবং সেশনগুলির মধ্যে তাদের শেষ হওয়া আমার দরকার। আমি আমার সমস্ত তথ্য wasোকানোর আগে NSUserDefaults
, কিন্তু এটি কাজ করছে না।
-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'.
আমি যখন আমার কাস্টম ক্লাস, "প্লেয়ার" ক্লাসে রাখি তখন আমি পেয়েছি ত্রুটি বার্তাটি NSUserDefaults
। এখন, আমি পড়েছি যে দৃশ্যত NSUserDefaults
কেবল কিছু ধরণের তথ্য সঞ্চয় করে। তাহলে আমি কীভাবে আমার জিনিসগুলিতে প্রবেশ করব 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
সুতরাং এটি আমার ক্লাস, বেশ সোজা এগিয়ে, আমি জানি এটি আমার জিনিসগুলি তৈরিতে কাজ করে। সুতরাং এখানে অ্যাপডেলিগেট ফাইলের প্রাসঙ্গিক অংশগুলি (যেখানে আমি এনক্রিপশন এবং ডিক্রিপ্ট ফাংশনগুলি কল করি):
@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;
}
আইই, সমস্ত কোড সম্পর্কে দুঃখিত। শুধু সাহায্য করার চেষ্টা করছি। মূলত, অ্যাপটি চালু হবে এবং তারপরে তাত্ক্ষণিকভাবে ক্রাশ হবে sh আমি এটিকে অ্যাপটির এনক্রিপশন অংশে সংকীর্ণ করেছি, যেখানে এটি ক্রাশ হয়ে গেছে, তাই আমি কিছু ভুল করছি তবে আমি নিশ্চিত নই কি। সাহায্য আবার প্রশংসা হবে, আপনাকে ধন্যবাদ!
(আমি এখনও ডিক্রিপ্ট করার মতো কাজ করতে পারি নি, কারণ আমি এখনও এনক্রিপ্ট করার কাজ করতে পারি নি))