此保存的数据不存在';在重新启动iOS之前,似乎无法访问

此保存的数据不存在';在重新启动iOS之前,似乎无法访问,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个自定义的NSCoding类,它在必要时存储和检索自身。但是,它不会将数据提供给我的表视图,直到为其中的自定义Person对象数组提供一个条目并重新启动应用程序,然后再提供另一个条目。然而,第一个消失了 之后,它似乎加载正常 下面是该类的实现 #import "DataStorage.h" @implementation DataStorage @synthesize arrayOfPeople = _arrayOfPeople; + (DataStorage *)sharedIn

我有一个自定义的
NSCoding
类,它在必要时存储和检索自身。但是,它不会将数据提供给我的表视图,直到为其中的自定义
Person
对象数组提供一个条目并重新启动应用程序,然后再提供另一个条目。然而,第一个消失了

之后,它似乎加载正常

下面是该类的实现

#import "DataStorage.h"

@implementation DataStorage


@synthesize arrayOfPeople = _arrayOfPeople;

+ (DataStorage *)sharedInstance
{
    static DataStorage *state = nil;
    if ( !state )
    {
        NSData *data =[[NSUserDefaults standardUserDefaults] objectForKey:@"DataStorageBank"];

        if (data)
        {
            state = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        }
        else
        {
            state = [[DataStorage alloc] init];
        }
    }
    return state;
}

- (instancetype)initWithCoder:(NSCoder *)decoder
{
    self = [self init];
    if (self) {


        if ([decoder decodeObjectForKey:@"DataStoragePeopleArray"]) {
            _arrayOfPeople = [[decoder decodeObjectForKey:@"DataStoragePeopleArray"] mutableCopy];
        } else {
            _arrayOfPeople = [[NSMutableArray alloc] init];
        }



    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:_arrayOfPeople forKey:@"DataStoragePeopleArray"];
}

- (void)save
{
    NSData *appStateData = [NSKeyedArchiver archivedDataWithRootObject:self];
    [[NSUserDefaults standardUserDefaults] setObject:appStateData forKey:@"DataStorageBank"];
}


@end
我将对象添加到
\u arrayOfPeople
中,如下所示:

Person *person = [[Person alloc] initWithFirstName:firstName personSurname:surname personCompay:company personPosition:position personEmail:email personMobile:mobile personProduct:product];

        [[DataStorage sharedInstance].arrayOfPeople addObject:person];
        [[DataStorage sharedInstance] save];
并通过以下方式将其加载到表视图中:

Person *personAtIndex = [[DataStorage sharedInstance].arrayOfPeople objectAtIndex:indexPath.row];
    [_arrayOfPeople addObject:personAtIndex];
    cell.textLabel.text = personAtIndex.firstName;
    cell.detailTextLabel.text = personAtIndex.surname;
将它们加载到表视图是在方法中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

看起来您只在
initWithCoder:
中初始化
\u arrayOfPeople
。但是,如果您的数据尚未存在于用户默认值中,则可以使用
state=[[DataStorage alloc]init]
初始化共享实例。这不会调用
initWithCoder:
所以
\u arrayOfPeople
nil
,直到您再次保存和加载之后,当它最终初始化为
[[NSMutableArray alloc]init]
。要解决此问题,请将
\u arrayOfPeople=[[NSMutableArray alloc]init]
initWithCoder:
移动到
init
。(您也可以将其移动到
sharedInstance
,但它在
init
中更有意义,因为它不是特定于配置共享实例的。)

不相关,但也要确保同步

- (void)save
{
    NSData *appStateData = [NSKeyedArchiver archivedDataWithRootObject:self];
    [[NSUserDefaults standardUserDefaults] setObject:appStateData forKey:@"DataStorageBank"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

我记得。。。NSUserDefault应该同步,谢谢。但还是不行!我再次查看了你的代码并编辑了我的答案。现在应该解决了。