我有一个iOS应用,如果没有WiFi或数据连接,会在NSMutableArray
中将两个NSUserDefaults
存储为对象。在随后的访问中,用户应该能够通过从NSUserDefaults
检索已保存的数据来加载其表中存储的数据,但遗憾的是我无法这样做。 NSMutableArrays
存储的对象包含各种NSString
值作为参数。
以下是将我的数据保存在Singleton类中的代码:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[DataModel sharedInstance].testResultList forKey:@"resultTable"];
[defaults setObject:[DataModel sharedInstance].testResults forKey:@"jsonTable"];
[defaults synchronize];
这是来自UITableView
类的代码,它应该检索数据并将它们加载到表中:
- (void)viewDidLoad
{
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([[DataModel sharedInstance].testResults count] == 0) {
if ([defaults objectForKey:@"resultTable"] == nil) {
return;
}
else {
[DataModel sharedInstance].testResultList = [defaults objectForKey:@"resultTable"];
[DataModel sharedInstance].testResults = [defaults objectForKey:@"jsonTable"];
}
}
}
这是我的cellForRowAtIndexPath()
方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"testresultcell";
ResultTableViewCell *cell = (ResultTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ResultTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
TestResult *tResult = [[DataModel sharedInstance].testResultList objectAtIndex:indexPath.row];
cell.name.text = tResult.testTitle;
cell.date.text = tResult.dateStamp;
cell.score.text = [[DataModel sharedInstance] getScore:tResult.score];
cell.imgView.image = [UIImage imageNamed:[[DataModel sharedInstance] getImg:tResult.score]];
return cell;
}
谁能看到我做错了什么?我最初检查NSMutableArray
的当前值是否为空。只有这样我才能检查是否存在NSMutableArray
的已保存副本。如果是这样,那么我需要加载数组并在表格中显示内容。
答案 0 :(得分:4)
执行此操作的典型模式如下(我通常在我的ApplicationDelegate中执行):
// Set up some default values
NSDictionary *myDefaults = @{@"aStringDefaultKey":@"someString",@"aBoolKey":@YES};
// Register the default values
[[NSUserDefaults standardUserDefaults] registerDefaults:myDefaults];
// Get a reference to them
NSUserDefaults *userSettings = [NSUserDefaults standardUserDefaults];
我没有看到您在NSUserDefaults中注册默认值的位置。如果不这样做,则在没有先前设置的值的情况下,它们将不会作为默认值提供。
之后您可以使用以下内容引用该值或设置值:
// Set a value or update a value
[userSettings setObject:@"anotherString" forKey:@"aStringDefaultKey"];
[userSettings objectForKey:@"aStringDefaultKey"];
编辑:如果事实证明您的DataModel对象(您没有发布任何代码)由于不符合NSCopy规则而无法存储,则将其序列化为NSData可以存储在NSDictionary中的对象,并以这种方式执行。