1

私のtableViewには、新しいコアデータエントリを追加するためのボタンがナビゲーションバーにあります。これは正常に機能し、新しいエントリがコア データと tableView の上部に追加されます。次に、tableView でエントリ (または任意のエントリ) を選択すると、そのコア データ項目の詳細を表示する新しいビュー コントローラーに遷移するシークがあります。それもうまくいきます。

しかし、エントリを追加する方法を変更したいと思います。ナビゲーション バーで同じボタンを押して、新しいエントリをテーブルに追加したいと思います。しかし同時に、詳細ビューコントローラーに移行し、作成したばかりのエントリに対して作成したばかりの値を表示したいと考えています。

以下のコードからわかるように、ゲームの詳細を表示するシークは、選択された行を単純に取得し、それを詳細ビュー コントローラーに渡します。私の prepareForAddGameDetailSegue では、新しいエントリが挿入される新しく作成されたエントリの indexPath を 0 に設定するだけでごまかそうとしました。それは機能せず、移行前に fetchedResultsController が更新されていないためだと感じています。

そのため、詳細ビュー コントローラーが新しく作成されたゲームの値を読み込むと、null になります。しかし、tableView に戻って、その新しいゲームが挿入された行を選択すると、問題なく遷移し、詳細がすべて表示されます。

私が間違っているステップについて誰でも助けてくれますか?ありがとう!

セグエ ハンドラは次のとおりです。

- (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-(Game*)addGame新しく保存されたゲームを返します。返されたオブジェクトを使用して詳細ビューをロードします。
後で、リターン セグエで、新しく挿入されたオブジェクトのインデックスを見つけて選択します。
FRC のメソッドを使用- (NSIndexPath *)indexPathForObject:して、IndexPath を取得します。

于 2013-04-04T18:25:20.273 に答える