尝试在iOS中显示表的内容时,无法从NSUserDefaults加载数据

时间:2012-12-31 21:51:39

标签: ios uitableview nsmutablearray nsuserdefaults

我有一个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的已保存副本。如果是这样,那么我需要加载数组并在表格中显示内容。

1 个答案:

答案 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中的对象,并以这种方式执行。