OK、Core Dataを使用してMac OS Xアプリケーションを構築しています。NSArrayControllerからフェッチされた管理対象オブジェクトを変更する
基本レイアウトは、NSTableView
を含むメインウィンドウがあり、アプリケーションによって管理されるすべてのオブジェクトの簡単な説明が表示されます。エンティティはシンプルで、タイトル、日付、メモなどのいくつかのフィールドが含まれています。メインウィンドウには、エントリの追加、削除、および変更を行うコマンドがあります。エントリを追加または変更すると、そのオブジェクトのすべてのプロパティが編集可能な新しいウィンドウが表示されます。
エディタウィンドウは独自の.nibにあり、NSWindowController
のサブクラスで管理され、[[SUBCLASS alloc] initWithWindowNibName:]
呼び出しによってロードされます。このウィンドウの編集可能なフィールドは、NSObjectController
にバインドされています。このフィールドは、リストから1つのエントリを管理します。このコントローラーはペン先から何も外されていません。このコントローラーがロードされると、それぞれのmanagedObjectContext
およびcontent
の値が、メインオブジェクトコンテキストおよび編集中のエンティティにそれぞれ設定されます。
ので、オブジェクトを追加することは素晴らしい作品、そしてこのように動作します:
NSEntityDescription *entityDesc = [[self.managedObjectModel entitiesByName] objectForKey: @"LogEntryEntity"];
LogEntryEntity *entry = (LogEntryEntity *) [[NSManagedObject alloc] initWithEntity: entityDesc
insertIntoManagedObjectContext: self.managedObjectContext];
LogEditorController *editor = [[LogEditorController alloc] initWithWindowNibName: @"LogEditorWindow"
logEntry: entry];
entry.date = [NSDate dateOneHourAgoTo30Minutes];
[editor setSaveHandler: ^(LogEditorController *c)
{
NSError *error = nil;
if (![self.managedObjectContext save: &error])
NSLog(@"Failed to save object: %@", error);
[self.logTableView reloadData];
}];
[entry release];
[editor loadWindow];
[editor showWindow: self];
削除作品を、あまりにも:
NSIndexSet *selectedIndexes = [self.logTableView selectedRowIndexes];
if ([selectedIndexes count] != 1)
return;
LogEntryEntity *entry = (LogEntryEntity *) [[self.logArrayController arrangedObjects] objectAtIndex: [selectedIndexes firstIndex]];
LogEditorController *editor = [[LogEditorController alloc] initWithWindowNibName: @"LogEditorWindow"
logEntry: entry];
[editor setSaveHandler: ^(LogEditorController *c)
{
NSError *error = nil;
if (![self.managedObjectContext save: &error])
NSLog(@"error saving: %@", error);
}];
[editor loadWindow];
[editor showWindow: self];
:
NSIndexSet *selectedIndexes = [self.logTableView selectedRowIndexes];
if ([selectedIndexes count] == 0)
return;
[self.logArrayController removeObjectsAtArrangedObjectIndexes: selectedIndexes];
if (![self.managedObjectContext save: &error])
NSLog(@"error saving: %@", error);
をしかし、私は選択したエントリを編集するために行くとき
ここでは、ウィンドウが表示されたときに、フィールドに正しいエントリの内容が書き込まれます。 の直後に、すべてのフィールドがの値のエントリに設定されます(偶然ではなく、すべてのオブジェクトのオブジェクトIDが最も小さいオブジェクトに設定されます)。 NSObjectController
のcontent
の値が別のエンティティに変更されました。私が最初にcontent
を設定すると、編集したいことが確認されました。
ここでは何が起こっていますか?私は何か間違っていることは明らかですが、何が分からないのですか?