какао - unarchivedObjectOfClass не вызывает initWithCoder - PullRequest
0 голосов
/ 06 ноября 2018

Я занимаюсь разработкой приложения для MacOS с использованием target-C.

Я пытался сохранить объект NSArray в Core Data. Я пишу

- (id)reverseTransformedValue:(id)value
{
  return [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:value error:nil];
}

в классе, который наследует NSValueTransformer.

И один из элементов в моем объекте NSArray не имеет первичного вида (который имеет свойства, называемые courseName и courseInfos), поэтому я соответствую классу этого элемента. В этом классе я пишу:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [[self class] new];
    if (self = [super init])
    {
         self.courseName = [aDecoder decodeObjectForKey:@"courseName"];
         self.courseInfos = [aDecoder decodeObjectForKey:@"courseInfos"];
    }
    return self;
}

Когда мои приложения запускаются, вызывается reverseTransformedValue: метод, и все элементы, кроме этого специального неосновного элемента в моем объекте NSArray, декодируются. Я поместил точку останова в initWithCoder: метод в классе этого специального элемента, и он никогда не запускается. Я использую некоторые инструменты и нахожу, что элемент успешно сохраняется в моих основных данных, поэтому процесс кодирования не вызывает проблем.

1 Ответ

0 голосов
/ 20 января 2019

Я это исправил, вот решение:

Мой объект - «Адрес» (примечание: это не NSArray)

Address.h

@interface Address : NSObject <NSSecureCoding>

@property (nonatomic, strong) NSString *street;

@property (nonatomic, strong) NSString *city;

@end

Address.m

@implementation Address
- (id) initWithCoder:(NSCoder *)aDecoder
{

    self = [self init];
    if (self == nil) 
   {
        return nil;
    }

    self.street = [aDecoder decodeObjectOfClass:[Address class] forKey:@"street"];

    self.city = [aDecoder decodeObjectOfClass:[Address class]
                                         forKey:@"city"];
    return self;
}

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

    [encoder encodeObject:self.street forKey:@"street"];

    [encoder encodeObject:self.city forKey:@"city"];

}

+ (BOOL)supportsSecureCoding 
{

    return YES;

}

Archive.h

@property (nonatomic, strong) Address *address;

Archive.m

UserDBO *userDBO = [[UserDBO alloc] init];

// Архив

NSError *error = nil;

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.address requiringSecureCoding:YES error:&error];

    if(error) 
    {

        NSLog(@"archivedDataWithRootObject: %@", error);

    }

userDBO.address = data; 

// UnArchive

Address *address = [NSKeyedUnarchiver unarchivedObjectOfClass:[Address class] fromData:userDBO.address error:&error];

        if(error) 
       {

            NSLog(@"unarchivedObjectOfClass: %@", error);

        }

UserDBO.h

@property (nonatomic, strong) NSData *address;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...