CoreDataの扱いについて数ヶ月間ずっと悩み続けたので、その内容について超ざっくりと書きます。
Master-Detail Applicationのプロジェクトをベースにしたときに、画面遷移先のTableViewControllerやViewControllerで必ず用意しないといけないものが以下の3つです。
- NSManagedObject
- NSManagedObjectContext
- NSFetchedResultController
上の3つのオブジェクトがTableViewControllerにあれば、とりあえずは動くはずです。
例えば、画面が遷移する際には、渡す元のTableViewControllerのprepareForSegue: sender:
で
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
[[segue destinationViewController] setManagedObject:managedObject];
[[segue destinationViewController] setFetchedResultsController:self.fetchedResultsController];
[[segue destinationViewController] setManagedObjectContext:self.fetchedResultsController.managedObjectContext];
}
などと書いて、それぞれオブジェクトを渡します。
ここで渡す先のTableViewControllerヘッダーには
@property (strong, nonatomic) id managedObject;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
としてプロパティを宣言しているものとします。
簡単に解説すると、NSManagedObject(エンティティがクラスになったもの)を使うには単体じゃダメで、必ずNSManagedObjectContextを用意しておかないといけないのです。
ついでにNSFetchedResultsControllerがあると、TableViewにデータを渡すのが楽になるのです。
CoreDataの習得にあたって、最初は誰もがMaster-Detail Applicationのプロジェクトから始めると思います。
プロジェクトをつくってビルドすると、まあ当たり前ですが普通に動くので、「これをベースにいじっていったら楽勝じゃん?」とか思うんですよね。
ほんでいじったら急に動かなくなって、検索しても解決が出てこなくて、挫折して諦めるわけです。
私の場合はCoreDataに加えてTableViewについても初めて触れたため、ドツボにはまりました。
最終的にいろいろな解説を読んでようやく理解しましたが、大事な部分は上記の通りで、単純です。