在我的应用程序中,我有一个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];
答案 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,它可以随时更改任何更新的表格,并且您有一个单独的详细信息视图来显示表格中的项目。
核心数据要记住的一些事项: