좋아, 그래서 나는 주위에 약간의 파고를하고 있었고, 나는 내 문제를 알고 있지만 그것을 고치는 방법을 모른다. 일부 데이터를 보유하기 위해 사용자 정의 클래스를 만들었습니다. 이 수업을 위해 물건을 만들고 세션 사이에 지속될 필요가 있습니다. 모든 정보를에 넣기 전에는 NSUserDefaults
작동하지 않습니다.
-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'.
사용자 정의 클래스 "Player"를에 넣을 때 나타나는 오류 메시지 NSUserDefaults
입니다. 이제는 분명히 NSUserDefaults
일부 유형의 정보 만 저장 한다는 것을 읽었습니다 . 어떻게 물체를 넣을 수 NSUSerDefaults
있습니까?
내 사용자 지정 개체를 "인코딩"하여 넣는 방법이 있어야한다는 것을 읽었지만 구현 방법을 잘 모릅니다. 도움을 주시면 감사하겠습니다. 감사합니다!
****편집하다****
좋아, 그래서 아래 주어진 코드로 작업했습니다 (감사합니다!),하지만 여전히 문제가 있습니다. 기본적으로 코드가 이제 충돌하고 오류가 발생하지 않기 때문에 이유를 모르겠습니다. 아마도 나는 기본적인 것을 놓치고 너무 피곤하지만, 우리는 보게 될 것입니다. 내 사용자 정의 클래스 "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
구현 파일 :
#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, 모든 코드에 대해 죄송합니다. 그냥 도와 주려고 기본적으로 앱이 시작된 후 즉시 충돌합니다. 앱의 암호화 부분으로 좁혔습니다. 충돌이있는 곳이므로 뭔가 잘못하고 있지만 확실하지 않습니다. 다시 한 번 도움을 주셔서 감사합니다.
(아직 암호화 작업을하지 않았으므로 아직 암호 해독을하지 않았습니다.)