1

在我的 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();
    }

}
4

1 回答 1

3

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

于 2013-04-04T18:25:20.273 回答