Pekala, bu yüzden etrafta alay yapıyorum ve sorunumu fark ettim, ama nasıl düzelteceğimizi bilmiyorum. Bazı verileri tutmak için özel bir sınıf yaptım. Bu sınıf için nesneler yaparım ve oturumlar arasında sürmeleri gerekir. Tüm bilgilerimi girmeden önce NSUserDefaults
, ama bu işe yaramıyor.
-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'.
Bu benim özel sınıf, "Oyuncu" koymak zaman aldığım hata mesajı NSUserDefaults
. Şimdi, görünüşe göre NSUserDefaults
sadece bazı bilgi türlerinin saklandığını okudum . Öyleyse nesnelerimi nasıl alırım NSUSerDefaults
?
Ben özel nesne "kodlamak" ve sonra koymak için bir yol olması gerektiğini okudum, ama nasıl uygulanacağından emin değilim, yardım takdir edilecektir! Teşekkür ederim!
****DÜZENLE****
Tamam, bu yüzden aşağıda verilen kodla çalıştım (Teşekkür ederim!), Ama hala bazı sorunlar yaşıyorum. Temel olarak, kod şimdi çöküyor ve neden olduğundan emin değilim, çünkü herhangi bir hata vermiyor. Belki de temel bir şeyi özlüyorum ve çok yorgunum ama göreceğiz. İşte benim Özel sınıf, "Oyuncu" uygulanması:
@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
Uygulama Dosyası:
#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
İşte bu benim sınıfım, oldukça basit, biliyorum ki nesnelerimi yapmakta işe yarıyor. İşte AppDelegate dosyasının ilgili bölümleri (şifreleme ve şifre çözme işlevlerini çağırdığım):
@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
Ve sonra uygulama dosyasının önemli bölümleri:
#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, tüm kodlar için üzgünüm. Sadece yardım etmeye çalışıyorum. Temel olarak, uygulama başlatılacak ve hemen çökecektir. Uygulamanın şifreleme kısmına daralttım, çöktüğü yer bu yüzden yanlış bir şey yapıyorum ama ne olduğundan emin değilim. Yardım tekrar takdir edilecektir, teşekkür ederim!
(Henüz şifrelemeyi çalışmadığım için şifresini çözemedim.)