代码之家  ›  专栏  ›  技术社区  ›  McCadi

对于数组中的某些字符串,NSUserDefaults返回nil

  •  0
  • McCadi  · 技术社区  · 7 年前

    我有一个自定义对象“女人”。我试图在其中存储以下值,并使用NSUserDefaults将其保存在可变数组中。我使用的代码如下。我还在对象中使用NSCoding。

           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?

    编辑:这是我的自定义类。

    #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
    

     #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
    

    这里还有一个断点屏幕截图,显示最新的对象(索引2)在存储到NSDefaults之前具有值。

    enter image description here

    更新:在切换“nameofgirl”和区间字符串后,区间字符串起作用,但nameofgirl返回nil。因此,出于某种原因,只有前两个值起作用。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Willeke    7 年前

    intervalLength , pmsLength periodLength NSString