此保存的数据不存在';在重新启动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应该同步,谢谢。但还是不行!我再次查看了你的代码并编辑了我的答案。现在应该解决了。