2014-02-26 4 views
1

코어 데이터를 사용하는 응용 프로그램에서 작업하고 있습니다. 내 모델은 기본적으로 "설명"이라고 불리는 객체의 목록입니다. 각 설명에는 "등록 정보"목록이 있습니다. 이것은 매우 단순한 일대 다 관계입니다. 두 열이 포함 된 NSTableView가 있습니다. 내 속성 목록 내 테이블보기를 채우기 위해 바인딩을 사용하고NSArrayController는 NSTableView에서 일대 다 관계로 바인딩합니다.

:

- (IBAction)addProperty:(id)sender { 
    NSLog(@"Add a new property"); 

    PCSDescriptionProperty *property = [PCSDescriptionProperty insertInManagedObjectContext: self.storage.managedObjectContext]; 
    property.name = @"New property"; 
    property.info = @"New property info"; 

    [self.descriptionObject addPropertiesObject: property]; 
} 

이 문제는 다음과 같습니다

self.controller = [[NSArrayController alloc] initWithContent: self.descriptionObject.properties]; 

NSTableColumn *propertyColumn = [self.propertiesTableView tableColumnWithIdentifier: @"property_column"]; 
[propertyColumn bind: NSValueBinding toObject: self.controller withKeyPath: @"arrangedObjects.name" options: nil]; 

NSTableColumn *infoColumn = [self.propertiesTableView tableColumnWithIdentifier: @"info_column"]; 
[infoColumn bind: NSValueBinding toObject: self.controller withKeyPath: @"arrangedObjects.info" options: nil]; 

내 "addProperty"메소드 호출하는 버튼이 있습니다 addPropertiesObject:을 호출해도 KVO 알림이 나타나지 않고 내 tableview가 새로 고쳐지지 않습니다. addChangValueForKey/didChangeValueForKey를 호출하기 전에 addPropertiesObject를 사용하여 성공하지 못했습니다.

왜 그런가? 감사합니다.

+1

속성을 설명에 추가하는 대신 property.description = self.descriptionObject를 설정해보십시오. 이온 개체입니다. 또한 두 관계를 올바르게 올바르게 설정했는지 확인하십시오. 그리고 ArrayController 엔티티를 @ "Property"로, managedObjectContext를 managedObjectContext로, contentSet을 description.properties로 설정합니다. 그것은 당신이 IB에서하는 방법입니다. –

+0

실제로 변경 내용을 저장할 수 있기 때문에 관계가 작동합니다. NSArrayController의 내용은 "다시 가져온"것이 아닙니다. –

+1

여전히 To-Many 관계의 descriptionObject.properties에 contextSet을 바인딩해야합니다. initWithContent를 사용하지 마십시오. –

답변

1

덕분에, 내가 한 여기에 무엇을 : 나는 initWithContent 사용을 중단 : 실제로 내 ArrayController의 NSContentSet에 속성의 내 세트를 바인딩 : 내 addProperty에,

self.controller = [[NSArrayController alloc] init]; 
[self.controller bind: NSContentSetBinding toObject: self.apiDescription withKeyPath: @"properties" options: nil]; 

다음 : 방법을 추가 할 내용은 내 새 속성을 내 설명에 추가하는 방법을 바꾸는 것입니다.

property.descriptionObject = self.descriptionObject; 
2

테이블보기는 그려지면 새로 고쳐지지 않습니다. 테이블보기에서 reloadData을 명시 적으로 호출해야합니다. 속성을 설정 한 후 [yourTableView reloadData];

동일한 작업을 수행하는 또 다른 방법은 description에 속성을 추가 한 후 arrayController에도 속성을 추가하는 것입니다. [self.controller addObject:property]; 그것은 tableView에 객체를 추가 할 것이고 새로 고침은 필요하지 않습니다.

아무 것도 작동하지 않으면 tableView의 내용을 재설정하십시오. 던컨 Groenewald에

[self.controller setContent:self.descriptionObject.properties]; 
+0

NSTableView 새로 고침을 자동으로 트리거하는 방법이 있습니까? 나는 내가 NS (Mutable) Array를 콘트롤러의 콘트롤러로 사용할 때 그 콘텐트를 관리 할 수 ​​있었다고 확신한다. 내 컬렉션에 객체를 추가하려고 시도하지만 .. meh. –

+1

배열 개체에만 추가하는 경우 NSTableView의 데이터를 다시로드해야합니다. NSArrayController는 내부적으로이 부분을 처리합니다. –

+0

바인딩을 사용하는 것은 아니지만 대답은 +1입니다. –