【问题标题】:NSUserDefaults returning nil for some strings in arrayNSUserDefaults 为数组中的某些字符串返回 nil
【发布时间】:2017-07-01 05:31:30
【问题描述】:

我有一个自定义对象“女人”。我正在尝试将以下值存储在其中并使用 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];
}

结果在屏幕截图中。对我来说有趣的是,第一个字符串成功了,但其他字符串没有。 :

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

.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

这也是一个断点截图,它显示最新的对象(索引 2)在存储在 NSDefaults 之前具有值。

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

【问题讨论】:

  • 你也可以分享你的自定义女性文件吗?
  • 在将数据保存到 NSUserDefaults 之前尝试 NSLog 您的数据我认为值不会附加到您在检索时将为零的间隔长度变量。如果这不起作用,请尽可能显示您的自定义类。
  • 我得到了自定义类和另一个屏幕截图,谢谢。还有什么想法吗?
  • 使用encodeObject:编码intervalLength、pmsLength和periodLength NSString对象。
  • 成功了。哇,我怎么给你点赞。太感谢了 !!!!我应该注意到了。

标签: objective-c xcode nsmutablearray nsuserdefaults


【解决方案1】:

intervalLengthpmsLengthperiodLengthNSString 对象。使用 encodeObject: 对它们进行编码。

【讨论】:

  • 如果我被允许,我会投票,但这对我有用。谢谢!!!
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多