2013-04-04 74 views
1

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

} 

回答

3

變化-(void)addGame-(Game*)addGame簽名並返回新保存的遊戲。 使用返回的對象來加載您的詳細視圖。
以後,在返回的segue中,找到新插入的對象的索引並選擇它。
您可以使用:FRC的- (NSIndexPath *)indexPathForObject:方法來獲取IndexPath。

+0

不錯!你是對的,只需從addGame方法返回newGame即可。然後,我只是通過'detailViewController.game = [self addGame]傳遞它;'不需要抓住它的indexPath。 – Selch 2013-04-04 18:32:27

相關問題