2016-05-17 10 views
0

私はpropertyとして、カスタムNSDictionaryの別のセットのNSArrayを持っているカスタムオブジェクトを持っています。配列をエンコードしてデコードすると、値が必要なオブジェクトは空になります。私が読んだことは、オブジェクトがNSCodingに準拠していると言いますが、NSArray内のオブジェクトを正しくエンコードするために何か必要があるように感じます...何が欠けていますか? NSDictionaryのサブクラスするカスタムオブジェクトの配列を持つカスタムオブジェクトをエンコード/デコードするにはどうすればよいですか?

+1

なぜ 'Trough'は' NSObject'ではなく 'NSDictionary'のサブクラスですか? – rmaddy

答えて

1
@interface Trough : NSDictionary <NSMutableCopying, NSCoding> 
@property int col; 
@property int row; 
@property BOOL isLocked; 
@property NSMutableArray *tokens; 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    // encoding properties 
    [encoder encodeInteger:col forKey:@"col"]; 
    [encoder encodeInteger:row forKey:@"row"]; 
    [encoder encodeBool:isLocked forKey:@"isLocked"]; 
    [encoder encodeObject:tokens forKey:@"tokens"]; 
} 

- (id)initWithCoder:(NSCoder *)coder { 
    self = [super init]; 
    if (self) { 
     col = (int)[coder decodeIntegerForKey:@"col"]; 
     row = (int)[coder decodeIntegerForKey:@"row"]; 
     isLocked = [coder decodeBoolForKey:@"isLocked"]; 
     tokens = [coder decodeObjectForKey:@"tokens"]; 
    } 
    return self; 
} 

非常に珍しい:

@interface Game : NSObject <NSMutableCopying, NSCoding> 
@property int rows; 
@property int cols; 
@property NSMutableArray *troughs; 

- (void)encodeWithCoder:(NSCoder *)encoder { 

    // encoding properties 
    [encoder encodeInteger:rows forKey:@"rows"]; 
    [encoder encodeInteger:cols forKey:@"cols"]; 
    [encoder encodeObject:troughs forKey:@"troughs"]; 
} 

- (id)initWithCoder:(NSCoder *)coder { 
    self = [super init]; 
    if (self) { 
     rows = (int)[coder decodeIntegerForKey:@"rows"]; 
     cols = (int)[coder decodeIntegerForKey:@"cols"]; 
     troughs = [coder decodeObjectForKey:@"troughs"]; 
    } 
    return self; 
} 

トラフのアレイは、として定義されたオブジェクトを含んでいます。これらのNSCopying実装が動作する可能性がある場合、継承された動作も呼び出す必要があります。

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    [super encodeWithCoder:aCoder]; 
    // encode your Trough properties 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // decode your trough properties 
    } 
    return self; 
} 
+0

それは素晴らしいヒントでした!私は、TroughがNSDictionary型である必要はないことに気付きました。それをNSObjectに切り替えると、物事はうまくいっています。私はスーパーに電話してみませんでした。私はそのようなことをさまざまな時点で試みました。しかし、NSDictionaryのドキュメントでは、NSCodingに準拠しているとは言わないので、そうではないと仮定しました。とにかく、今はいいと思う。感謝!!! – Gwendyl

関連する問題