0

NSFetchedResultsControllerを使用してGiftオブジェクトのUITableViewListを管理しています。アイデアは、ユーザーがNavbar上のAddボタンをクリックしてGiftsを追加できるようにすることです。追加ボタンは、navigationControllerスタックにギフトを設定するためのビューをプッシュする必要があります。次に、ユーザーが実際にフィールドにデータを入力すると、ユーザーがビューをポップアップ(つまりリストに戻ってナビゲート)すると、新しいギフトがリストに表示されます。十分に簡単です。問題は、私がアプリを再起動しない限りメインリストが更新されないようだということです。全く失われた。終了するまで結果が表示されません。

GiftEditControllerで、

-(void) addgift{ 
    Gift *newGift = [NSEntityDescription insertNewObjectForEntityForName:@"Gift" inManagedObjectContext:self.managedObjectContext]; 
    GiftEditController *editController = [[GiftEditController alloc] initWithStyle:UITableViewStyleGrouped]; 
    editController.gift = newGift; 

    [self.navigationController pushViewController:editController animated:YES]; 
    [editController release]; 
} 

その後(giftlistcontroller.m)ユーザがメインテーブルビューに "+" ボタンをクリックしたときに呼び出され、ユーザーがフィールドを更新した場合...

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    if (textField == nameField) { 
     gift.name = textField.text; 
    } else if (textField == priceField) { 
     gift.price = [NSNumber numberWithFloat:[textField.text floatValue]]; 
    } 

    NSError *error; 
    if (![gift.managedObjectContext save:&error]) { 
     NSLog(@"Couldn't save in textFieldDidEndEditing"); 
    } 
} 

標準的なfetchedresultscontroller delegateメソッドはすべてgiftlistcontrollerで定義されています。完全に困惑し、どんな提案も大いに(!!!!)高く評価されるだろう。

答えて

1

おかげでみんなを強制的に[tableView reloadData]を呼び出します。私は最終的に解決策を見つけました。この問題を持つ他の誰かのために投稿するのが賢明だと思っていました。

あなたは正しく、テーブルをリロードする必要がありました。しかしそれでは不十分でした。問題は、私がちょうどボイラープレートfetchedResultsControllerリンゴが使用するコードをドロップしていたことです。この場合は動作しません。特に、fetchedResultsControllerの最初の数行を読む:

-(NSFetchedResultsController *)fetchedResultsController 
    if (fetchedResultsController != nil) 
    { 
     return fetchedResultsController; 
    } 

    .... 
} 

問題は1が、それはまだ新しいエントリを認識しない古いfetchedResultsControllerを使用している、テーブルを更新した場合でも、です。私はにviewDidAppear fetchedResultsControllerを更新することでこの問題を解決することができました:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    // Set the fetched results controller to nil in case we are coming back 
    // from a view that added or removed entries. 
    self.fetchedResultsController = nil; 

    NSError *error = nil; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     /* 
     Replace this implementation with code to handle the error appropriately. 

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
     */ 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    //reload the table to catch any changes 
    [self.tableView reloadData]; 

} 

はジェームズ・ウェブスターとルイありがとう。あなたたちは命を救う人です。

1

どこにでもテーブルをリロードすることはありません。 [myTableView reloadData];をコードに追加すると、アプリを終了することなくテーブルを「更新」することができます。

0

UITableViewはUIViewのlayoutSubviewsメソッドをオーバーライドし、UITableViewの新しいインスタンスを作成するとき、または新しいデータソースを割り当てるときにreloadDataを呼び出すようにします。テーブルビューをリロードすると、現在の選択を含む現在の状態がクリアされます。ただし、reloadDataを明示的に呼び出すと、この状態がクリアされ、その後の直接または間接のlayoutSubviews呼び出しによってリロードがトリガーされることはありません。要するに

[Source]

:リロードあなたの助けのため

+0

私のviewdidloadにそれを置いても何の違いもありませんでした。 gifteditcontroller内からsaveを呼び出すと、テーブルは - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex :(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)タイプを介して更新されます。問題は、ギフトオブジェクトを保存する私の呼び出しが別のコントローラで発生しているようです。 – Plastech

+0

'separate controller'にテーブルのインスタンスがある場合、そこに' reloadData'を呼び出すことができます。 –