2012-01-11 6 views
1

私はNSManagedObjectsのコンテナとしてNSFetchedResultsControllerを使用してにCoreDataのデータを表示しています。行を削除するコードはうまくいきますが、私の実装ではエレガントではありません。より良い方法がありますか?UITableView NSFetchedResultsControllerの考え方

以下のコードは削除イベントを示しています

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 

{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     // Delete the row from the data source 
     [myContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]]; 

     if (![myContext save:&error]) { 
      // Error handling 
     } 

     fetchedResultsController = nil; 

     if (![[self getFetchedResultController] performFetch:&error]) { 
      // Error handling 
     } 
     [tableView reloadData];   
    } 
} 

は私がnilfetchedResultsControllerを設定し、別の新しい内容を更新するためにフェッチを行います。

私の心配は、様々なフォーラムで、コンテキストの変更によって自動的にfetchedResultsControllerの変更が発生し、おそらくこの2回目のフェッチが不要であることを示唆していることです。私はこの時点でセクションを実装していません。

もう1つ懸念されるのは、コードがアニメーションなしで行を消してしまうことだけです。

滑らかなアニメーションを導入できますか?

+0

また、このフォーラムでは、電子メールで通知を受け取ることができますか? – user266429

答えて

2

NSFetchedResultsControllerDelegate Protocol methodsを使用して、テーブルとデータベースの変更を管理します。このようにして、NSFetchedResultsControllerのNSManagedObjectContext内でセーブするたびに、fetchedResultsControllerは管理されたojbectコンテキストによって通知されます。それから、fetchedResultsCotnrollerはデリゲートメソッドを呼び出します。

controllerWillChangeContent:とcontrollerDidChangeContentを実装したいので、テーブルビューのbeginUpdatesメソッドとendUpdatesメソッドを呼び出すことで、他のデリゲートメソッドの呼び出しを囲むことができます。 これは、テーブルビューがfetchedResultsControllerと同期しなくなることを防止します。これが完了したら、あなたは細胞の挿入や削除でアニメーションを導入することができ

fetchedResultsController = nil; 

     if (![[self getFetchedResultController] performFetch:&error]) { 
      // Error handling 
     } 
     [tableView reloadData];  

は、次に、これらの行を削除します。

+0

あなたの返事をありがとう - この問題については、もう少し宿題をする必要があります。あなたがリストアップしたデリゲートメソッドは私のプログラムにありますが、現在呼び出されていないので、何か不便があるはずです。私はプロトコルを実装していると思ったが、何かがオフであった。もう少し考え、研究してみましょう。 – user266429

+0

実際にAppleのプロジェクトには良い例があります - CoreData Books - これは私が欲しいものですが、ストーリーボードは使用しません。だから私は新しい環境への翻訳をしようとしています。 – user266429

+0

fetchedResultsControllerのデリゲートを、その中にデリゲートメソッドがあるコントローラに設定していることを確認してください。 – Jim

関連する問題