同时添加核心数据输入和segue

Posted

技术标签:

【中文标题】同时添加核心数据输入和segue【英文标题】:Add core data entry and segue at the same time 【发布时间】:2013-04-04 17:52:52 【问题描述】:

在我的 tableView 中,导航栏上有一个按钮,用于添加新的核心数据条目。这工作正常,新条目被添加到核心数据和 tableView 的顶部。然后,如果我在 tableView 中选择条目(或任何条目),我就会有一个序列转换到一个新的视图控制器,显示该核心数据项的详细信息。这也很好用。

但我想更改添加条目的方式。我想在导航栏中按下相同的按钮,我仍然希望将新条目添加到表格中。但同时我想转换到细节视图控制器,并为我刚刚创建的条目显示刚刚创建的值。

从下面的代码中可以看出,查看游戏详细信息的序列只是抓取选定的行并将其传递给详细视图控制器。在我的 prepareForAddGameDetailSegue 中,我试图通过将插入新条目的新创建条目的 indexPath 设置为 0 来作弊。这不起作用,我感觉这是因为我的 fetchedResultsController 在转换之前没有更新。

所以当细节视图控制器加载新创建的游戏时,值是空的。但是,如果我回到 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();
    


【问题讨论】:

【参考方案1】:

-(void)addGame的签名改为-(Game*)addGame并返回新保存的游戏。 使用返回的对象来加载您的详细视图。 稍后,在return segue中,找到新插入对象的索引并选择它。 可以使用:FRC的- (NSIndexPath *)indexPathForObject:方法获取IndexPath。

【讨论】:

不错!你是对的,只需从 addGame 方法返回 newGame 。然后我就直接用detailViewController.game = [self addGame];传了,不需要去抓取它的indexPath。

以上是关于同时添加核心数据输入和segue的主要内容,如果未能解决你的问题,请参考以下文章

无法保存到核心数据中

在不使用核心数据的情况下,在 segue 之后保存并记住 UIElement 值?

segueing时出现核心数据错误:无法在NSManagedObject类上调用指定的初始值设定项

segueing 时的核心数据错误:无法在 NSManagedObject 类上调用指定的初始化程序

Segue 以查看控制器崩溃

核心数据:使用新创建的 ManagedObject 转至细节控制器