UITableView Cell无法正确保存数据?

时间:2013-07-02 21:50:11

标签: ios uitableview nsuserdefaults

在我的应用程序中,我有一个UITableView和2个按钮“Save”和“Load”。在我的情况下,当用户保存他或她的曲目时,我的UITableView会添加一个带有曲目标题的新单元格,然后当用户点击单元格时,它将重新加载它们的曲目。这工作正常,但每当用户保存一个轨道,然后尝试保存另一个轨道时,新添加的单元格仅重新加载一个轨道。因此,我的tableview可以有10个具有名称的单元格,但无论何时点击其中一个,都只保存一个轨道。所以我的问题是,如何保存每个单元格的数据?这是我的保存功能:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:NSStringFromCGPoint(ball.center) forKey:@"ballPosition"];
[userDefaults synchronize];

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults];
[block1DF setObject:NSStringFromCGPoint(block1.center) forKey:@"block1Position"];
[block1DF synchronize];

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults];
[block2DF setObject:NSStringFromCGPoint(block2.center) forKey:@"block2Position"];
[block2DF synchronize];

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults];
[block3DF setObject:NSStringFromCGPoint(block3.center) forKey:@"block3Position"];
[block3DF synchronize];

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults];
[winBlockDF setObject:NSStringFromCGPoint(winBlock.center) forKey:@"winBlockPosition"];
[winBlockDF synchronize];

NSString *trackName = [[alertView textFieldAtIndex:0] text];
trackTitle.text = trackName;

[trackArray addObject:[NSString stringWithFormat:trackName,[trackArray count]+1]];
[self.myTableView reloadData];

然后我的tableView didSelectRowAtIndexPath:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
CGPoint ballPoint = CGPointFromString([userDefaults objectForKey:@"ballPosition"]);
[ball setCenter:ballPoint];

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults];
CGPoint block1Point = CGPointFromString([block1DF objectForKey:@"block1Position"]);
[block1 setCenter:block1Point];

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults];
CGPoint block2Point = CGPointFromString([block2DF objectForKey:@"block2Position"]);
[block2 setCenter:block2Point];

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults];
CGPoint block3Point = CGPointFromString([block3DF objectForKey:@"block3Position"]);
[block3 setCenter:block3Point];

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults];
CGPoint winBlockPoint = CGPointFromString([winBlockDF objectForKey:@"winBlockPosition"]);
[winBlock setCenter:winBlockPoint];

1 个答案:

答案 0 :(得分:1)

您只能保存一份数据的原因不是因为您有错误。因为NSUserDefaults只能保存一个版本的“ballPosition”。任何时候你保存另一个“ballPosition”它将取代你现有的“ballPosition”。

我建议不要使用NSUserDefaults。通常,当您想要保存许多类似数据的版本时,您希望使用Core Data。

这里有一个很好的教程http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started但是如果你想在这里快速浏览它是:

如果您在Xcode中创建一个新项目,请选择Master-Detail Application并选择Use Core Data,您将获得一个新的核心数据支持应用程序。

此演示应用程序创建一个“事件”对象表,每个对象都有一个名为“timestamp”的属性。

每次点击“添加”按钮,都会运行以下代码:

- (void)insertNewObject:(id)sender
{
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.
    [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];

    // Save the context.
    NSError *error = nil;
    if (![context save:&error]) {
         // Replace this implementation with code to handle the error appropriately.
         // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

这将创建一个新的Event对象,设置关键timeStamp的当前日期,并将对象保存到本地数据库。

这里的一个巨大优势是您现在完全使用MVC或模态视图控制器架构模式。您有一个完整的模态(和数据库)层,它独立于您的视图和控制器。

您也正确使用UITableViews,您有一个NSFetchedResultsController,它可以随时更改任何更新的表格,并且您有一个单独的详细信息视图来显示表格中的项目。

核心数据要记住的一些事项:

  1. 您有一个数据库架构。您可以在Xcode中的xcdatamodeld文件中编辑模式。您在模型中存储的任何内容都必须在此处定义。
  2. 如果你只是搞乱,你可以在任何时候更改你的xcdatamodel重新安装你的应用程序,它会正常工作,否则你需要处理迁移和你的架构的不同版本。
  3. 核心数据不是最容易学习的工具,但是一旦你学会了它,你就会在创建应用时有一个更好的起点。
相关问题