2

我有一个 iOS 应用程序,在没有 WiFi 或数据连接的情况下将两个NSMutableArray's 作为对象存储在其中。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's 的当前值是否为空。只有这样我才会去检查是否NSMutableArray存在已保存的副本。如果是这样,那么我需要加载数组并在我的表中显示内容。

4

1 回答 1

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 规则而无法存储,则将其序列化为可以存储在 NSDictionary 中的 NSData 对象,并且那样做。

于 2012-12-31T22:04:24.507 回答