2011-03-03 2 views
0

코어 데이터를 사용하여 Mac OS X 응용 프로그램을 빌드하고 있습니다.NSArrayController에서 가져온 관리 객체를 수정합니다.

기본 레이아웃은 NSTableView을 포함하는 주 창이 있으며 앱이 관리하는 모든 개체에 대한 간단한 설명을 표시합니다. 엔티티는 간단하며 제목, 날짜 및 메모와 같은 몇 가지 필드가 포함됩니다. 기본 창은 항목을 추가, 삭제 및 수정하는 명령을 제공합니다. 항목을 추가하거나 수정할 때 응용 프로그램은 해당 개체의 모든 속성을 편집 할 수있는 새 창을 표시합니다.

편집기 창, NSWindowController의 서브 클래스에 의해 관리되고 자신의 .nib에 거주하고 [[SUBCLASS alloc] initWithWindowNibName:] 호출을 통해로드됩니다. 이 창의 편집 가능한 필드는 목록에서 단일 항목을 관리하는 NSObjectController에 바인딩됩니다. 이 컨트롤러는 코코아 콩 (nib)에서 나온 것이 아닙니다. 이 컨트롤러가로드되면 managedObjectContextcontent 값이 각각 주 개체 컨텍스트와 편집중인 엔터티로 설정됩니다.

그래서 객체를 추가하는 것은 잘 작동하고, 다음과 같이 작동

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 개체를 전환하는 방법을 알 수 없습니다. 창이 다른 객체를 잘못 표시하는 것을 어떻게 확인할 수 있습니까? 객체 배열이 아닌 특정 객체를 전달하고 있습니까?

나는이 라인에서 주조를 제거하는 제안 :

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

을 ... 객체가 배열에서 반환 어떤 이유로 실제 LogEntryEntity 객체가 아닌 경우, 당신이 알고하지 않습니다 때문이다. 또 다른 managedObject이거나 완전히 다른 것일 수 있습니다. Objective-C의 캐스트는 매우 강력하며 컴파일러는 물론 암시 적으로이를 신뢰합니다.

관련 문제