Okay, also habe ich ein bisschen herumgestochert und ich erkenne mein Problem, aber ich weiß nicht, wie ich es beheben soll. Ich habe eine benutzerdefinierte Klasse erstellt, um einige Daten zu speichern. Ich mache Objekte für diese Klasse und ich muss sie zwischen den Sitzungen halten. Vorher habe ich alle meine Informationen eingegeben NSUserDefaults
, aber das funktioniert nicht.
-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'.
Dies ist die Fehlermeldung, die ich erhalte, wenn ich meine benutzerdefinierte Klasse "Player" in die NSUserDefaults
. Jetzt habe ich gelesen, dass anscheinend NSUserDefaults
nur einige Arten von Informationen gespeichert werden. Wie bekomme ich meine Objekte hinein NSUSerDefaults
?
Ich habe gelesen, dass es eine Möglichkeit geben sollte, mein benutzerdefiniertes Objekt zu "codieren" und dann einzufügen, aber ich bin mir nicht sicher, wie ich es implementieren soll. Hilfe wäre willkommen! Danke dir!
****BEARBEITEN****
Okay, also habe ich mit dem unten angegebenen Code gearbeitet (Danke!), Aber ich habe immer noch einige Probleme. Grundsätzlich stürzt der Code jetzt ab und ich bin mir nicht sicher warum, weil er keine Fehler enthält. Vielleicht fehlt mir etwas Grundlegendes und ich bin einfach zu müde, aber wir werden sehen. Hier ist die Implementierung meiner benutzerdefinierten Klasse "Player":
@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
Implementierungsdatei:
#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
Das ist also meine Klasse, ziemlich einfach, ich weiß, dass es bei der Herstellung meiner Objekte funktioniert. Hier sind die relevanten Teile der AppDelegate-Datei (wo ich die Verschlüsselungs- und Entschlüsselungsfunktionen aufrufe):
@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
Und dann die wichtigen Teile der Implementierungsdatei:
#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, entschuldige den ganzen Code. Ich versuche nur zu helfen. Grundsätzlich wird die App gestartet und stürzt dann sofort ab. Ich habe es auf den Verschlüsselungsteil der App eingegrenzt. Dort stürzt es ab. Ich mache also etwas falsch, bin mir aber nicht sicher, was. Hilfe wäre wieder dankbar, danke!
(Ich bin noch nicht zum Entschlüsseln gekommen, da ich noch nicht zum Verschlüsseln gekommen bin.)