2013-05-14 5 views
0

코어 데이터에 인스턴스를 추가하고 있습니다. 엔티티는 NSArrayController으로 표시됩니다. 컨트롤러를 통해 새로 추가 된 인스턴스에 액세스하고 싶습니다.핵심 데이터 : NSManagedObject를 추가 한 직후 NSArrayController를 업데이트하는 방법?

A "기술"인스턴스가 추가되고 나서 다음과 같이 selectAddedObject를 통해 액세스하려고 :

-(void)addSkill 
{ 
    [self selectAddedObject:[NSEntityDescription insertNewObjectForEntityForName:@"Skill" 
                  inManagedObjectContext:self.managedObjectContext]]; 
} 

- (void)selectAddedObject:(NSManagedObject *)addedMO 
{ 
    [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]]; 
    NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]); 
} 
이는 내가 첫 번째 라인으로

[self.managedObjectContext processPendingChanges]; 

을 추가 할 경우 작동하는 것 같다

selectAddedObject:. 그러나 일단 그렇게하면 문서가 여전히 저장해야한다는 사실을 잊어 버리며 자동 추가 기능없이 앱을 종료 할 수 있습니다. 그것을 사용자에게 강요하고 싶지는 마십시오!

다른 방법으로 어레이 컨트롤러를 즉시 업데이트하는 방법에 대한 아이디어가 있습니까? 아니면 다른 방법으로 객체를 추가할까요? 몇 가지 초기 답변 (예 : Updating NSTableView when enitiy is added to core data)은 OSX의 변경으로 인해 오래된 것 같습니다.

감사합니다.

답변

1

개체를 추가하려면 배열 컨트롤러를 사용하십시오. 구성하는 동안 어떤 시점에서 생성하고 선택 엔티티 ([self.sectionArrayController setEntityName:@"Skill"])로 설정되어 있는지 확인하고 모든 작업을 수행

- (void)createAndSelectNewObject 
{ 
    Skill *addedMO = [self.sectionArrayController newObject]; 

    if([self.sectionArrayController commitEditing]) { 

     [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]]; 
     NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]); 
    } 
} 

당신은 너무 선택을 변경하기 전에 편집을 커밋한다 (만 선택하면 변경 수정 사항이 커밋되었거나 전혀 수정되지 않았습니다.)

+0

감사합니다. 매우 우아하게 보입니다. 나는이 해결책을 시도한 후에 문제가있다 :'self.sectionArrayController'는 커밋 후에도 변하지 않은 수의 객체를 가지고있다! 그러나 반환 값은'예'입니다. Hmmm .... – markjs

+0

어레이 컨트롤러에서 (IB에서)'add :'를 사용하는 것만으로 인터페이스 빌더에서 "삽입 된 객체 선택"을 선택하지 않아도 새 객체를 선택하지 않습니다. – markjs

+0

작동하는 것은'[self.managedObjectContext processPendingChanges];를 추가하는 것입니다. 나는 정말로없이하고 싶다. '-commitEditing'가 작동하지 않고'-processPendingChanges'가하는 이유가 있습니까? – markjs

관련 문제