2011-03-03 13 views
0

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が最も小さいオブジェクトに設定されます)。 NSObjectControllercontentの値が別のエンティティに変更されました。私が最初にcontentを設定すると、編集したいことが確認されました。

ここでは何が起こっていますか?私は何か間違っていることは明らかですが、何が分からないのですか?

答えて

0

他のコードがあるか、またはエディタウィンドウを間違ってバインドしている場合を除き、オブジェクトを切り替える方法はこのコードからはわかりません。オブジェクトの配列ではなく特定のオブジェクトを渡しているため、editorウィンドウでほかのオブジェクトが間違って表示されることはありますか?

私はこのラインからキャストを取り外すことをお勧め:

LogEntryEntity *entry = (LogEntryEntity *) [[self.logArrayController arrangedObjects] objectAtIndex: [selectedIndexes firstIndex]]; 

...オブジェクトが配列から返されたいくつかの理由で実際のLogEntryEntityオブジェクトでない場合ので、あなたが知っていることはありません。別のmanagedObjectやそれ以外のものでもかまいません。 Objective-Cでのキャストは非常に強力でコンパイラはもちろん、それらを暗黙的に信頼します。

関連する問題