2017-06-28 1 views
0

私はカスタムオブジェクト "Woman"を持っています。私はそれに以下の値を格納し、NSUserDefaultsを使用して変更可能な配列に保存しようとしています。そのために私が使用するコードは次のとおりです。私はまた、オブジェクトでNSCodingを使用しています。NSUserDefaultsは配列の一部の文字列に対してnilを返します

 if (women ==nil) { 

        women =[[NSMutableArray alloc] init]; 
       } 
       NSString *string =[NSString stringWithFormat:@"%f", interval]; 
       //store to woman object 
       Woman* woman = [[Woman alloc] initWithFull:nameOfGirl withdate2:perfectdate withintervalLength:string withperiodLength:[NSString stringWithFormat:@"432000"] withpmsLength:[NSString stringWithFormat:@"432000"]]; 

       [women addObject:woman]; 


       [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:women] forKey:@"women"]; 

私はそれを取得するために、このコードを使用します。

//pull women from archive 
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *dataRepresentingSavedArray = [currentDefaults valueForKey:@"women"]; 
if (dataRepresentingSavedArray != nil) 
{ 
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray]; 
    if (oldSavedArray != nil) 
     women = [[NSMutableArray alloc] initWithArray:oldSavedArray]; 
    else 
     women = [[NSMutableArray alloc] init]; 
} 

結果はスクリーンショットです。私にとって興味深いのは、最初の文字列はそれを作るが、他の文字列は作成しないということです。 :The first string is correctly retrieved, and the NSDate, however the last three arents?

EDIT:私のカスタムクラスです。

.H:

#import <Foundation/Foundation.h> 

@interface Woman : NSObject <NSCoding> 

@property (nonatomic,strong) NSString *girlname; 
@property (nonatomic,strong) NSDate *date2; 
@property (nonatomic,strong) NSString *intervalLength; 
@property (nonatomic,strong) NSString *periodLength; 
@property (nonatomic, strong) NSString *pmsLength; 

- (id)initWithFull:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength; 

- (id)initWithNoInterval:(NSString *)girlname withdate2:(NSDate *)date2 withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength; 

- (id)initWithIntervalnoPMSPeriod:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength; 

- (void) encodeWithCoder:(NSCoder*)encode; 
- (id) initWithCoder:(NSCoder*)decode; 


@end 

そして.M:ここ

#import "Woman.h" 

    @implementation Woman 

    -(id)initWithFull:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength { 


     self = [super init]; 

     self.girlname = girlname; 
     self.date2 = date2; 
     self.intervalLength = intervalLength; 
     self.pmsLength = pmsLength; 
     self.periodLength = periodLength; 
     return self; 



    } 

    -(id)initWithIntervalnoPMSPeriod:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength { 

     self = [super init]; 

     self.girlname = girlname; 
     self.date2 = date2; 
     self.intervalLength = intervalLength; 
     return self; 



    } 


    -(id)initWithNoInterval:(NSString *)girlname withdate2:(NSDate *)date2 withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength { 

     self = [super init]; 

     self.girlname = girlname; 
     self.date2 = date2; 
     self.pmsLength = pmsLength; 
     self.periodLength = periodLength; 
     return self; 



    } 

    - (id)initWithCoder:(NSCoder *)coder { 
     if (self = [super init]) { 
      self.girlname = [coder decodeObjectForKey:@"girlname"]; 
      self.date2 = [coder decodeObjectForKey:@"date2"]; 
      self.intervalLength = [coder decodeObjectForKey:@"intervalLength"]; 
      self.pmsLength = [coder decodeObjectForKey:@"pmsLength"]; 
      self.periodLength = [coder decodeObjectForKey:@"periodLength"]; 

     } 


     return self; 
    } 

    - (void)encodeWithCoder:(NSCoder *)coder { 
     [coder encodeObject:_girlname forKey:@"girlname"]; 
     [coder encodeObject:_date2 forKey:@"date2"]; 
     [coder encodeBool:_intervalLength forKey:@"intervalLength"]; 
     [coder encodeBool:_pmsLength forKey:@"pmsLength"]; 
     [coder encodeBool:_periodLength forKey:@"periodLength"]; 

    } 


    @end 

はまた、それがNSDefaultsに格納される前に、最新のオブジェクト(指標2)の値を有することを示すブレークポイントスクリーンショットであります。

enter image description here

UPDATE: "nameofgirl" と間隔文字列を切り替えた後、間隔文字列が働いたが、nameofgirlはnilを返しました。何らかの理由で最初の2つの値が働いているだけです。

+0

カスタム女性ファイルも共有できますか? – Nirmalsinh

+1

NSUserDefaultsに保存する前にデータをNSLogしようとしています。取得中にnilになる間隔の長さの変数に値が付いていないと思います。可能であれば、カスタムクラスを親切に表示してください。 –

+0

カスタムクラスと別のスクリーンショットがあります。ありがとうございます。これ以上のアイデアは? – McCadi

答えて

0

intervalLength,pmsLengthおよびperiodLengthは、NSStringオブジェクトです。 encodeObject:を使用してエンコードします。

+0

私が許可されていれば私はアップヴォートしますが、これは私のために働きます。ありがとうございました !!! – McCadi

+0

答えを受け入れることができます。 – Willeke

関連する問題