Ios 同时增加核心数据录入和segue

Ios 同时增加核心数据录入和segue,ios,core-data,uistoryboardsegue,Ios,Core Data,Uistoryboardsegue,在我的tableView中,导航栏上有一个按钮,用于添加新的核心数据条目。这很好,新条目被添加到核心数据和tableView的顶部。然后,如果我在tableView中选择条目(或任何条目),我会有一个序列,它会转换到一个新的视图控制器,显示该核心数据项的详细信息。那也行 但是我想改变我添加条目的方式。我想按导航栏上的相同按钮,但我仍然希望将新条目添加到表中。但同时,我想转换到“细节视图”控制器,并显示刚刚创建的条目值 正如您从下面的代码中所看到的,sequeto view game detail

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

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

正如您从下面的代码中所看到的,sequeto view game details只需抓取选中的行并将其传递给detail view控制器。在我的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();
    }

}

-(void)addGame
的签名更改为
-(Game*)addGame
,并返回新保存的游戏。 使用返回的对象加载详细信息视图。
稍后,在返回序列中,找到新插入对象的索引并选择它。

您可以使用FRC的:
-(nsindepath*)indexPathForObject:
方法来获取indepath。

Nice!您是正确的,只需从addGame方法返回newGame即可。然后我只是用
detailViewController.game=[self addGame]传递了它不需要获取它的索引XPath。