同时添加核心数据条目并同步
问题描述:
在我的tableView中,我在导航栏上有一个按钮来添加新的核心数据条目。这工作正常,新条目被添加到核心数据和tableView的顶部。然后,如果我选择tableView中的条目(或任何条目),我有一个seque转换到一个新的视图控制器,显示该核心数据项的详细信息。这也很好。同时添加核心数据条目并同步
但我想改变我如何添加条目。我想推动导航栏中的相同按钮,我仍然希望将新条目添加到表格中。但同时我想转换到详细视图控制器并显示我刚刚创建的条目刚刚创建的值。
正如您从下面的代码中可以看到的,查看游戏细节的seque只需抓取选定的行并将其传递给详细视图控制器。在我的prepareForAddGameDetailSegue中,我尝试通过将新条目插入的新创建条目的indexPath设置为0来作弊。这不起作用,我有一种感觉,因为我的fetchedResultsController在转换之前没有更新。
所以当详细视图控制器加载新创建的游戏的值为null。但是,如果我回到tableView,然后选择插入新游戏的那一行,它会很好地转换,细节将全部显示出来。
任何人帮助我做错了什么步骤?谢谢!
这里是SEGUE处理程序:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showGameDetails"]) {
[self prepareForGameDetailSegue:(UIStoryboardSegue *)segue sender:(id)sender];
return;
}
if ([[segue identifier] isEqualToString:@"addGameDetails"]) {
[self prepareForAddGameDetailSegue:(UIStoryboardSegue *)segue sender:(id)sender];
return;
}
}
- (void)prepareForGameDetailSegue:(UIStoryboardSegue*)segue sender:(id)sender {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
Game *SelectedGame = (Game *)[[self fetchedResultsController] objectAtIndexPath:indexPath];
//pass the selected game to the new view controller
GameDetailViewController *detailViewController = (GameDetailViewController *)[segue destinationViewController];
detailViewController.title = [NSString stringWithFormat:@"Game Details"];
detailViewController.game = SelectedGame;
[detailViewController updateInterface];
}
- (void)prepareForAddGameDetailSegue:(UIStoryboardSegue*)segue sender:(id)sender {
[self addGame];
Game *newGame = (Game *)[[self fetchedResultsController] objectAtIndexPath:0];
GameDetailViewController *detailViewController = (GameDetailViewController *)[segue destinationViewController];
detailViewController.title = [NSString stringWithFormat:@"New Game"];
detailViewController.game = newGame;
[detailViewController updateInterface];
}
这里的addGame方法:
-(void)addGame {
Game *newGame = (Game *)[NSEntityDescription insertNewObjectForEntityForName:@"Game"
inManagedObjectContext:_managedObjectContext];
NSDate *today = [NSDate date];
newGame.gameDate = today;
newGame.points = 600;
newGame.seconds = [NSNumber numberWithInt:10];
NSError *error = nil;
if (![_managedObjectContext save:&error]) {
NSLog(@"Error in adding a new game %@, %@", error, [error userInfo]);
abort();
}
}
答
变化-(void)addGame
到-(Game*)addGame
签名并返回新保存的游戏。 使用返回的对象来加载您的详细视图。
以后,在返回的segue中,找到新插入的对象的索引并选择它。
您可以使用:FRC的- (NSIndexPath *)indexPathForObject:
方法来获取IndexPath。
不错!你是对的,只需从addGame方法返回newGame即可。然后,我只是通过'detailViewController.game = [self addGame]传递它;'不需要抓住它的indexPath。 – Selch 2013-04-04 18:32:27