Được rồi, vì vậy tôi đã thực hiện một số chọc, và tôi nhận ra vấn đề của mình, nhưng tôi không biết làm thế nào để khắc phục nó. Tôi đã thực hiện một lớp tùy chỉnh để giữ một số dữ liệu. Tôi tạo các đối tượng cho lớp này và tôi cần chúng kéo dài giữa các phiên. Trước khi tôi đưa tất cả thông tin của mình vào NSUserDefaults
, nhưng điều này không hoạt động.
-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'.
Đó là thông báo lỗi tôi nhận được khi tôi đặt lớp tùy chỉnh của mình, "Người chơi", trong NSUserDefaults
. Bây giờ, tôi đã đọc lên rằng dường như NSUserDefaults
chỉ lưu trữ một số loại thông tin. Vì vậy, làm thế nào tôi có được các đối tượng của tôi vào NSUSerDefaults
?
Tôi đọc rằng nên có một cách để "mã hóa" đối tượng tùy chỉnh của mình và sau đó đặt nó vào, nhưng tôi không chắc cách triển khai nó, sự giúp đỡ sẽ được đánh giá cao! Cảm ơn bạn!
****BIÊN TẬP****
Được rồi, vì vậy tôi đã làm việc với mã được đưa ra dưới đây (Cảm ơn bạn!), Nhưng tôi vẫn gặp một số vấn đề. Về cơ bản, mã bị sập bây giờ và tôi không chắc tại sao, vì nó không đưa ra bất kỳ lỗi nào. Có lẽ tôi đang thiếu một cái gì đó cơ bản và tôi quá mệt mỏi, nhưng chúng ta sẽ thấy. Đây là cách triển khai lớp Tùy chỉnh của tôi, "Trình phát":
@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
Tập tin thực hiện:
#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
Vì vậy, đó là lớp học của tôi, khá thẳng về phía trước, tôi biết nó hoạt động trong việc tạo ra các đối tượng của tôi. Vì vậy, đây là các phần có liên quan của tệp AppDelegate (nơi tôi gọi các chức năng mã hóa và giải 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
Và sau đó là các phần quan trọng của tệp thực hiện:
#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, xin lỗi về tất cả các mã. Chỉ cần cố gắng để giúp đỡ. Về cơ bản, ứng dụng sẽ khởi chạy và sau đó sụp đổ ngay lập tức. Tôi đã thu hẹp nó xuống phần mã hóa của ứng dụng, đó là nơi nó bị sập, vì vậy tôi đang làm gì đó sai nhưng tôi không chắc là gì. Giúp đỡ sẽ được đánh giá cao một lần nữa, cảm ơn bạn!
(Tôi chưa nhận được giải mã, vì tôi chưa mã hóa hoạt động được.)