2013-10-17 51 views
0

我有一个自定义类符合NSCoding协议,但仍然拒绝编码,当我调用写入文件。自定义目标c类不编码

@implementation PXLevel 

- (id)initWithName:(NSString *)name andArray:(NSMutableArray *)map { 
    self = [super init]; 
    self.name = name; 
    self.map = map; 
    return self; 
} 

- (id)initWithName:(NSString *)name { 
    self = [super init]; 
    self.name = name; 

    NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < 8; i++) { 
     NSMutableArray *line = [[NSMutableArray alloc] init]; 
     for (int j = 0; j < 8; j++) { 
      [line addObject:@"grass"]; 
     } 
     [tempArray addObject:line]; 
    } 
    self.map = tempArray; 
    return self; 
} 

-(void) encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:self.name forKey:@"levelName"]; 
    [aCoder encodeObject:self.map forKey:@"levelMap"]; 
} 

-(id) initWithCoder:(NSCoder *)aDecoder 
{ 
    if((self = [super init])) 
    { 
     self.name = [aDecoder decodeObjectForKey:@"levelName"]; 
     self.map = [[aDecoder decodeObjectForKey:@"levelMap"] mutableCopy]; 

    } 

    return self; 
} 

正如您所看到的,变量映射是一个包含字符串的多维数组。不知道这是不是搞砸了什么。

我顺便说一句接口

@interface PXLevel : NSObject <NSCoding> 

@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) NSMutableArray *map; 

- (id)initWithName:(NSString *)name andArray:(NSMutableArray *)map; 
- (id)initWithName:(NSString *)name; 
+0

什么对象在调用'writeToFile:'on?它与你的PXLevel类有什么关系? –

+0

具体而言,PXLevel对象的可变数组(上面的实现)。我检查了代码,该方法可以保存一个空数组到一个新的plist,但添加一个PXLevel到它并没有任何反应。 – evilseto

回答

0

假设你正在尝试编写使用writeToFile:atomically:

NSCoding到文件创建不能用writeToFile:atomically:使用的序列化存档。您需要使用NSKeyedArchiver,如下所示:

[NSKeyedArchiver archiveRootObject:levelObject toFile:@"path/level-object.txt"]; 
+0

您是否必须使用此方法存档到txt文件?此外,这只能存档自定义对象,因为我尝试使用PXLevel对象的可变数组,并且数据返回的不正确。 – evilseto

+0

哎呀!忘了去双方。将我的加载方法更改为unarchiveObjectWithFile,现在它可以工作!非常感谢你的帮助! – evilseto

+0

不客气。顺便说一句,.txt只是一个扩展名,如果你愿意,你可以使用.archive或自定义扩展名。 – nomann