2014-09-21 3 views
-1

Я пытаюсь реализовать методы NSCoder encodeWithCoder и initWithCoder для пользовательского объекта, который я создал, который имеет дочерний массив пользовательских объектов. Оба пользовательских объекта, использующих вышеупомянутые методы, но после того, как объект верхнего уровня был декодирован, значение для массива всегда равно нулю.NSCoder не работает с NSArray

Оба объекта реализуют методы, приведенные ниже, словарь и массивы или популярны из библиотеки, которую я получаю для получения имен полей и превращения объектов в словари. Я проверил, что encodeObject вызывается в массиве, и в это время массив не равен нулю. Я также проверил, что метод декодирования принимает ноль с другой стороны.

Я не могу решить, где я иду не так? Правильно ли я предполагаю, что до тех пор, пока объекты дочернего массива реализуют протокол, я должен быть в порядке, чтобы сделать это таким образом?

- (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; 
} 
+0

Не забудьте вызвать '[super initWithCoder:]' в 'initWithCoder'. – quellish

+0

NSObject не реализует initWithCoder? –

+0

Это не было указано в вашем вопросе – quellish

ответ

0

Я понял ваш вопрос перед:

NSKeyedArchiver/Unarchiver должны кодировать и декодировать NSArrays и NSDictionaries без каких-либо проблем.

Но я думаю, так как сам ваш массив содержит пользовательские объекты, которые реализуют ниже 2 функции:

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

Попробуйте использовать ниже для массива

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray]; 

Также используйте NSKeyedUnarchiver для декодирования.

+0

Возможно, вам придется сохранить данные в файле или NSDefault. – bllakjakk

Смежные вопросы