2017-04-26 10 views
0

보기 컨트롤러를 통해 NSDocument 인스턴스의 NSArray 속성에 NSArrayController (차례대로 테이블 뷰에 의해 바인드 됨)를 바인딩하는 올바른 방법을 알아내는 데 문제가 있습니다.배열 컨트롤러를 NSDocument 배열 속성에 바인딩하는 방법은 무엇입니까?

내 NSDocument 하위 클래스에는 NSArray * pages 속성이 있습니다. 먼저 뷰 컨트롤러에서 pages 속성을 미러링했는데, 이는 NSDocument가 pages 배열에 항목을 추가 할 때 테이블 뷰가 업데이트되지 않는다는 것을 의미합니다. 이 경우 업데이트를 수행하는 유일한 방법은보기 컨트롤러에서 will../didChangeValueForKey:@"pages"이지만보기 컨트롤러에서 변경 사항이 트리거되지 않으면 실용적이지 않습니다. NSDocument에서 will/didChangeValueForKey을 호출해도 어레이 컨트롤러가 업데이트되지 않습니다.

ViewController의 document.pages에 직접 바인딩하려고 시도했지만 작동하지 않거나 업데이트가 표시되지 않습니다.

여기에 사용할 올바른 기술은 무엇입니까?

+0

'pages' 속성이 [KVO Compliance] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#/) 규칙을 준수하는지 확인 했습니까?/apple_ref/doc/uid/20002178-BAJEAIEE)? – Willeke

+0

NSDocument는 NSObject를 상속하므로 KVO를 준수한다고 가정합니다. pages 속성은'@property (nonatomic, strong) NSMutableArray * pages;로 정의됩니다. - 이해할 수있는 것부터 모두 필요한 것입니다. 맞습니까? – fbitterlich

+0

'self.pages = someArray' yes를하면, [self.pages addObject : someObject]'no. 당신은'mutableArrayValueForKey :'또는'willChange : valuesAtIndexes : forKey :'/'didChange : valuesAtIndexes : forKey :'를 사용해야 만합니다. – Willeke

답변

0

해결되었습니다. 문제는 내가 찾고있는 곳이 아니지만 해결되었습니다.

내가 이렇게 만든 document 속성에 배열 컨트롤러를 결합했다 : 그것은 KVO 호환되지 않기 때문에

- (Document *)document { 
    return (Document *)self.view.window.windowController.document; 
} 

, 작동하지 않습니다. 솔루션은 단순히 NSDocument 인스턴스를 self.representedObject에 할당하는 것이 었습니다.이 인스턴스는 "실제"속성이므로 관찰 할 수 있습니다. willChangeValudForKey:/didChangeValueForKey:pages 배열에

포장 변경은 예상대로 Willeke 그의 의견에 제안보다 구체적인 버전이 아마 더 정확하지만, 바인딩 배열 컨트롤러를 업데이트하는 작업 않습니다.