захаванне карыстацкага аб'екта, які змяшчае яшчэ адзін карыстацкі аб'ект у NSUserDefaults

Я разумею, як захаваць карыстацкі аб'ект у NSUser Defaults, але калі я паспрабаваў рэалізаваць захаванне аб'екта з аб'ектам іншага тыпу ўнутры яго (гэта называецца кампазіцыя, калі я не памыляюся), ідучы Яго крокі для ўнутранага аб'екта, як я зрабіў для першага я атрымаў паведамленне пра памылку выканання. Не маглі б вы падрабязна апісаць крокі, якія я павінен зрабіць для таго, каб захаваць і правільна здабываць усё

0
Пакажыце нам, што вы зрабілі (ваш код), і мы раскажам вам, што здарылася з ім.
дададзена аўтар rob mayoff, крыніца
І памылка часу выканання.
дададзена аўтар Josh Caswell, крыніца

1 адказы

Усе вашыя аб'екты павінны рэалізаваць пратакол NSCoding. NSCoding працуе рэкурсіўна для аб'ектаў, якія будуць захаваны. Напрыклад, у вас ёсць 2 карыстацкіх класаў

@interface MyClass : NSObject {

}
@property(nonatomic, retain) NSString *myString;
@property(nonatomic, retain) MyAnotherClass *myAnotherClass;

@interface MyAnotherClass : NSObject {

}
@property(nonatomic, retain) NSNumber *myNumber;

Для захавання аб'екта MyClass ў NSUserDefaults неабходна рэалізаваць пратакол NSCoding для абодвух гэтых класаў:

Для першага класа:

-(void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.myString forKey:@"myString"];
    [encoder encodeObject:self.myAnotherClass forKey:@"myAnotherClass"];
}

-(id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if ( self != nil ) {
        self.myString = [decoder decodeObjectForKey:@"myString"];
        self.myAnotherClass = [decoder decodeObjectForKey:@"myAnotherClass"];
    }
    return self;
}

Для другога класа:

-(void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.myNumber forKey:@"myNumber"];
}

-(id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if ( self != nil ) {
        self.myNumber = [decoder decodeObjectForKey:@"myNumber"];
    }
    return self;
}

Звярніце ўвагу, калі ваш іншы клас (MyAnotherClass вышэй) таксама карыстацкі аб'ект тое, што карыстацкі аб'ект павінны ажыццяўляць NSCoding, а таксама. Нават у вас ёсць NSArray, якія няяўна ўтрымлівае прыстасаваныя аб'екты вы павінны рэалізаваць NSCoding для гэтых аб'ектаў.

4
дададзена
дзякуй дружа
дададзена аўтар Andrey Chernukha, крыніца
Я ўпэўнены, што вы не можаце зрабіць гэта. stackoverflow.com/a/19720674/8047 Вы павінны пераўтварыць NSData </​​код> першы.
дададзена аўтар Dan Rosenstark, крыніца
Калі ласка, вы можаце сказаць мне ў сваім першым класе ў мяне ёсць масіў з MyAnotherClass. Як я магу выкарыстоўваць NSCoding.
дададзена аўтар Kittu, крыніца