-1

カスタム オブジェクトの子配列を持つ、作成したカスタム オブジェクトに対して NSCoder メソッドの encodeWithCoder および initWithCoder を実装しようとしています。両方のカスタム オブジェクトは上記のメソッドを採用していますが、トップ レベル オブジェクトがデコードされた後は、配列の値は常に nil になります。

両方のオブジェクトは、以下のメソッドを実装します。ディクショナリと配列、またはフィールド名を取得してオブジェクトをディクショナリに変換するためのライブラリからの一般的なもの。配列で encodeObject が呼び出されていることを確認しましたが、現時点では配列は nil ではありません。デコードメソッドが反対側でnilを受け取っていることも同様に確認しました..

どこが間違っているのかわかりませんか?子配列オブジェクトがプロトコルを実装している限り、このようにしても問題ないと思いますか?

- (void)encodeWithCoder:(NSCoder *)aCoder{
    NSDictionary* dictionary = [jrModelBinder unBind:self];
    for(NSString* field in dictionary)
    {
        id val = [self valueForKey:field];
        [aCoder encodeObject:val forKey:field];
    }
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    if(self = [super init]){
        NSArray* fields = [jrModelBinder propertyNames:self];
        for(NSString* field in fields)
        {
            id val = [aDecoder decodeObjectForKey:field];
            [self setValue:val  forKey:field];
        }
    }
    return self;
}
4

1 に答える 1

0

以前、あなたの質問を誤解しました:

NSKeyedArchiver/Unarchiver は、NSArray と NSDictionaries を問題なくエンコードおよびデコードする必要があります。

しかし、あなたの配列自体には、以下の2つの機能を実装するカスタムオブジェクトが含まれていると思います:

- (id)initWithCoder:(NSCoder *)aDecoder
- (void)encodeWithCoder:(NSCoder *)enCoder

配列に以下を使用してみてください

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray];

また、NSKeyedUnarchiver を使用してデコードします。

于 2014-09-21T20:14:49.660 に答える