使用 NSCoding 编码、解码和编辑 NSMutableArray
Encoding, decoding, and editing a NSMutableArray with NSCoding
我遵循了 Ray Wenderlich 关于使用单例和 NSCoding 保存游戏数据的教程 (http://www.raywenderlich.com/63235/how-to-save-your-game-data-tutorial-part-1-of-2)。他们所做的一切我都能够用于 NSStrings(更改值、存储、在我的项目中使用)。我试图制作一个 NSMutableArray,这样我就可以添加和保存一个字符串列表,但它没有用。可能有一个非常简单的解决方案,所以在此先感谢您容忍新手。
我的代码:
in RWGameData.h(我使用游戏数据的单例):
@property (nonatomic, strong) NSMutableArray *dataArray;
在RWGameData.m中,在@implementation
之后:
static NSString* const GameDataArrayofValues = @"dataArray";
-(void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.dataArray forKey:GameDataArrayofValues];
}
-(instancetype)initWithCoder:(NSCoder *)decoder {
self = [self init];
if (self) {
_dataArray = [[decoder decodeObjectForKey:GameDataArrayofValues] mutableCopy];
}
return self;
}
(还有该教程中的所有其他代码,例如保存方法等)
在myGame.m
[[RWGameData sharedGameData].dataArray addObject:@"objectString"];
[[RWGameData sharedGameData] save];
在此之后立即记录数组的内容显示它为空。 [RWGameData sharedGameData].dataArray
接受了 addObject
调用,因为我将它创建为 NSMutableArray,但它似乎并没有真正通过。
有什么想法吗?
我猜 _dataArray 是 nil。
您应该向 initWithCoder 添加代码以检查它是否能够读取数组数据。如果不是,_dataArray 将为零。在那种情况下,您应该初始化一个空的可变数组。
更新后的 initWithCoder 可能如下所示:
-(instancetype)initWithCoder:(NSCoder *)decoder {
self = [self init];
if (self)
{
_dataArray = [[decoder decodeObjectForKey:GameDataArrayofValues] mutableCopy];
if (_dataArray)
_dataArray = [[NSMutableArray alloc] init];
}
return self;
}
同样,您需要实现 "regular" init 方法,将 _dataArray 设置为一个空的可变数组。
我遵循了 Ray Wenderlich 关于使用单例和 NSCoding 保存游戏数据的教程 (http://www.raywenderlich.com/63235/how-to-save-your-game-data-tutorial-part-1-of-2)。他们所做的一切我都能够用于 NSStrings(更改值、存储、在我的项目中使用)。我试图制作一个 NSMutableArray,这样我就可以添加和保存一个字符串列表,但它没有用。可能有一个非常简单的解决方案,所以在此先感谢您容忍新手。
我的代码:
in RWGameData.h(我使用游戏数据的单例):
@property (nonatomic, strong) NSMutableArray *dataArray;
在RWGameData.m中,在@implementation
之后:
static NSString* const GameDataArrayofValues = @"dataArray";
-(void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.dataArray forKey:GameDataArrayofValues];
}
-(instancetype)initWithCoder:(NSCoder *)decoder {
self = [self init];
if (self) {
_dataArray = [[decoder decodeObjectForKey:GameDataArrayofValues] mutableCopy];
}
return self;
}
(还有该教程中的所有其他代码,例如保存方法等)
在myGame.m
[[RWGameData sharedGameData].dataArray addObject:@"objectString"];
[[RWGameData sharedGameData] save];
在此之后立即记录数组的内容显示它为空。 [RWGameData sharedGameData].dataArray
接受了 addObject
调用,因为我将它创建为 NSMutableArray,但它似乎并没有真正通过。
有什么想法吗?
我猜 _dataArray 是 nil。
您应该向 initWithCoder 添加代码以检查它是否能够读取数组数据。如果不是,_dataArray 将为零。在那种情况下,您应该初始化一个空的可变数组。
更新后的 initWithCoder 可能如下所示:
-(instancetype)initWithCoder:(NSCoder *)decoder {
self = [self init];
if (self)
{
_dataArray = [[decoder decodeObjectForKey:GameDataArrayofValues] mutableCopy];
if (_dataArray)
_dataArray = [[NSMutableArray alloc] init];
}
return self;
}
同样,您需要实现 "regular" init 方法,将 _dataArray 设置为一个空的可变数组。