NSKeyedArchiver を使用して NSData に変換し、それを NSUserDefaults に格納するオブジェクトがあります。オブジェクトが持つ配列の要素を除いて、すべてが正しく保存されます。配列内のすべてのオブジェクトは、NSCoder プロトコルに準拠しています (または、それらが呼ばれるものは何でも - 例self.property = [decoder decodeObjectForKey:@"key"] and [encoder encodeObjectForKey:@"key"]
) 。
オブジェクトを保存すると、配列の要素は配列に残りますが、それらのプロパティ自体は保存されません。sycnrhonize
私はメソッドを呼び出すので、それは問題ではありません。
それ以外の場合は、保存してロードするのは正しいことに注意してください。オブジェクトに属する配列の要素を保存しないだけです。私はそれを別々に保存する必要がありますか?
「現在のステータス」の NSNumber は保存されていません。目的と目標を保存しています
インポート "Level.h"
@implementation Level
@synthesize objective = _objective;
@synthesize isComplete = _isComplete;
@synthesize goldReward = _goldReward;
@synthesize xpReward = _xpReward;
@synthesize missionID = _missionID;
@synthesize currentStatus = _currentStatus;
@synthesize targetName = _targetName;
@synthesize owner = _owner;
-(void)dealloc{
[super dealloc];
}
-(id)initWithMissionID:(int)number{
if (self = [super init]) {
self.currentStatus = 0;
self.isComplete = NO;
self.missionID = [NSNumber numberWithInt:number];
[self setUpMisson];
}
return self;
}
-(void)setUpMisson{
if ([self.missionID intValue] == 0) {
self.xpReward = [NSNumber numberWithInt:100];
self.goldReward = [NSNumber numberWithInt:100];
self.objective = [NSNumber numberWithInt:3];
self.targetName = @"Swordsman";
CCLOG(@"Gotta kill some swordsmen!");
}
}
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.objective forKey:@"objective"];
[encoder encodeObject:self.isComplete forKey:@"isComplete"];
[encoder encodeObject:self.goldReward forKey:@"goldReward"];
[encoder encodeObject:self.xpReward forKey:@"xpReward"];
[encoder encodeObject:self.missionID forKey:@"missionID"];
[encoder encodeObject:self.currentStatus forKey:@"currentStatus"];
[encoder encodeObject:self.targetName forKey:@"targetName"];
[encoder encodeObject:self.owner forKey:@"owner"];
CCLOG(@"SAVING LEVEL");
}
-(id)initWithCoder:(NSCoder *)decoder{
if (self = [super init]) {
self.objective = [[decoder decodeObjectForKey:@"objective"]retain];
self.isComplete = [[decoder decodeObjectForKey:@"isComplete"]retain];
self.goldReward = [[decoder decodeObjectForKey:@"goldReward"]retain];
self.xpReward = [[decoder decodeObjectForKey:@"xpReward"]retain];
self.missionID = [[decoder decodeObjectForKey:@"missionID"]retain];
self.targetName = [[decoder decodeObjectForKey:@"targetName"]retain];
self.owner = [[decoder decodeObjectForKey:@"owner"]retain];
CCLOG(@"LOADING LEVEL");
}
return self;
}
-(void)updateStatusForKill:(AI *)killedTarget{
CCLOG(@"WE KILLED: %@ and OUR GOAL IS: %@",killedTarget.name,self.targetName);
if ([killedTarget.name isEqualToString:self.targetName]) {
[self setCurrentStatus:[NSNumber numberWithInt:[self.currentStatus intValue]+1]];
CCLOG(@"Current Status: %i Objective: %i", [self.currentStatus intValue],[self.objective intValue]);
if ([self.currentStatus intValue] == [self.objective intValue]) {
[self completeMission];
}
}
}
-(void)completeMission{
[self.owner setCoins:[NSNumber numberWithInt:[[self.owner coins]intValue] + [self.goldReward intValue]]];
[self.owner setXp:[NSNumber numberWithInt:[[self.owner xp]intValue] + [self.xpReward intValue]]];
CCLOG(@"complete");
[[self.owner missionList]removeObject:self];
}
@end
編集:「所有者」は、保存されているオブジェクトを参照します。ここに問題があると思うので、それを削除して再度テストしています。
編集:そしてそれは何もしませんでした!