編集:以下の(非常に役立つ)コメントに基づいて、さらにレビューした後、UIManagedDocumentを使用してコアデータ機能を取得する場合は、インスタンスが開かれているときに注意を払うことを(私のような他の新人のために)追加したいと思いますあなたのアプリで。取得したエラーは、フェッチされた結果コントローラーがセットアップされていたときに、管理対象オブジェクトのコンテキストが nil だったためです。UIManagedDocument インスタンスが開かれた後に、フェッチされた結果コントローラーをセットアップするメソッド呼び出しを移動しました。これは非常に基本的なことであり、ほとんどの人にとって常識的な問題かもしれませんが、私たち新人にとっては、コア データがアプリ デリゲートで設定されていない場合、ドキュメントが使用可能な状態である必要があることを学習する必要があります。 fetchedResultsController を設定できます。
私はコア データに関する Paul Hegarty のスタンフォード大学の講義、特に「Photomania」アプリのデモ講義に取り組んでいます。
写真の NSDictionaries を使用する代わりに、NSStrings を格納するモデル オブジェクト (たとえば、人の名前など) のみを含めるようにアプリを変更しました。これは単なる学習課題です。
彼のコードを使用して UIManagedDocument を正常に再作成し、以下の 2 つのメソッドを使用してビュー コントローラーの管理オブジェクト プロパティをドキュメントの管理オブジェクト コンテキストのプロパティに設定したと思います (もちろん、私のメソッドではなく彼のメソッドです)。
このコードを、画面に表示される tableview コントローラーに配置して、viewDidLoad でマネージド オブジェクト コンテキストが存在するかどうかをテストできるようにします (これは彼の CoreDataTableViewController クラスのサブクラスです)。それは管理対象オブジェクト コンテキストの有効なテストでもありますか?
UIManagedDocument を作成または開くコードは理解していますが、管理オブジェクト コンテキストが nil である理由がわかりません (viewDidLoad の小さなテストを変更すると、コンテキストが == nil であることがわかります)。
この時点では、コンテキストには何も書き込まれておらず、取得した結果も含めていません。
レクチャー アプリの簡略化されたバージョンで、マネージド オブジェクト コンテキストとフェッチされた結果コントローラーが nil であるというエラーが表示され続けたため、セクションに分割しています。
この場合、先に進む前に、有効な管理対象オブジェクト コンテキストを取得しているかどうかをテストしたいと考えています。基本的にコピーされたコードに欠けている基本的な情報がいくつかあると強く感じています(学習目的で)。
管理対象オブジェクトのコンテキストが nil である理由を知っている人はいますか? または、設定時に何かを見逃したので、この時点でそのようにする必要がありますか? または、UIManagedDocument のコンテキストをテーブル ビュー コントローラーの (自己) コンテキストとして設定したときは?
どんな情報でも大歓迎です。
-(void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
_managedObjectContext = managedObjectContext;
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (!self.managedObjectContext) [self useDemoDocument];
}
-(void)useDemoDocument
{
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Demo Document"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];
if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
//create it
[ document saveToURL:url
forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success) {
if (success) {
self.managedObjectContext = document.managedObjectContext;
}
}];
} else if (document.documentState == UIDocumentStateClosed){
//open it
[document openWithCompletionHandler:^(BOOL success) {
if (success) {
self.managedObjectContext = document.managedObjectContext;
}
}];
} else {
//try to use it
self.managedObjectContext = document.managedObjectContext;
}
}
-(void)viewDidLoad
{
if (self.managedObjectContext) {
NSLog(@"there is a managed object context");
}
}