2010-04-19 2 views
1

저는 코코아의 바인딩 세계에 대해 상당히 새롭기 때문에 (아마도/오해로 인한) 몇 가지 문제가 있습니다.NSArrayController에 바인딩 된 테이블 열을 업데이트하십시오.

나는 Plugin 클래스의 객체를 포함하는 plugins이라는 NSMutableArray를 포함하는 싱글 톤을가집니다. 그것은 플러그인 배열에 객체를 추가하는 loadPlugins 메소드를 가지고 있습니다. 이것은 언제라도 호출 될 수 있습니다. 인터페이스 빌더에 인스턴스로 추가되었습니다.

또한 IB는 NSObjectController이며, 콘텐트 콘센트는 싱글 톤에 연결됩니다. NSArrayController의 contentArray가 NSObjectController (컨트롤러 키는 '선택', 모델 키 경로는 'plugins', 객체 클래스 이름은 'Plugin')에 바인딩됩니다.

마지막으로 필자 클래스의 속성 키를 사용하여 값이 NSArrayController의 arrangedObjects에 바인딩 된 두 개의 열이있는 테이블 뷰가 있습니다.

지금까지 표준 (자습서에서 알 수있는 한). 내 문제는 싱글 톤에서 loadPlugins 메서드가 호출되고 객체가 플러그인 배열에 추가 될 때 테이블이 객체를 표시하도록 업데이트되지 않는다는 것입니다 (nib로드 전에 loadPlugins가 호출되지 않는 한). tableView에서 호출 된 -reloadData는 아무 것도 수행하지 않습니다.

참조 된 배열이 업데이트되었음을 ​​NSArrayController에 알리는 방법이 있습니까? NSArrayController, loadPlugins 사용할 수있는 - add : 메서드가 이해하지만이 표시 특성에서 완전히 별도로 singleton 유지하려는 바람직하지 않습니다.

이는 관련이 보인다 : Refresh Cocoa-Binding - NSArrayController - ComboBox

라인 : 아마도 문제를 정확하게 파악하는 것 같다 "컨트롤러의 뒤에서 배열을 편집"하지만 내가 할 수 있다는 것을 희망하는 것은 모르는 싱글을 가지고 컨트롤러.

미리 감사드립니다.

TableColumn --('arrangedObjects', 'pluginName', Value)--> NSArrayController 
NSArrayController --('selection', 'plugins', ContentArray)--> NSObjectController 
NSObjectController --(content)--> PluginsManager 

답변

5

가 작동 얻을 (적절한 KVO 알림을 트리거에 의해) 퍼팅 시도 대신

[plugins addObject:somePlugin]; 

[self willChangeValueForKey:@"plugins"]; 
[plugins addObject:somePlugin]; 
[self didChangeValueForKey:@"plugins"]; 

을 이상적으로 당신이 KVC 지원에 대한 전체 구현해야합니다, 당신은 K를 실행하는 데 KVC를 사용할 수 있습니다 VO는 Bindings 업데이트를 트리거합니다. 당신이를했다면, 당신은 사용할 수 있습니다 http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/Compliant.html :

[self insertObject:somePlugin inPluginsAtIndex:0]; 

은 KVC 준수를 위해 필요한 사항에 대한 정보를 원하시면,이 읽기.

0

참조 배열이 업데이트되었다는 NSArrayController를 알 수있는 방법이 있나요 : 편집 \

...

TechZen의 제안 사항에 따라

, 여기에 바인딩입니까?

꼭 그렇게해서는 안됩니다. 그것이 바로 키 - 값 관찰입니다. 전체 바인딩 기능의 기초입니다. 바운드 오브젝트 (이 경우 인터페이스 요소)는 관찰 한 오브젝트가 변경되었음을 자동으로 (통지를) 수신합니다. 변화가 일어 났음을 수동으로 알려주지 않아야합니다. 테이블이 업데이트되지 않으면 바인딩이 잘못되었습니다.

텍스트 설명에서 말하기는 어렵지만 문제는 NSObjectController가 "선택"으로 설정되어 있다는 것입니다. NSObjectController에 다른 UI 요소를 바인딩하고 해당 요소가 컨트롤러에서 데이터 항목을 선택하는 경우에만 작동합니다.당신은 문제를 볼 수 있습니다 당신이 게시 할 경우 우리의 나머지 부분을 이해할 수

Object1--(controller key, key path, class)--> Object2 
Object2--(controller key, key path, class)--> Object3 

:

당신은 같은 바인딩 뭔가를 작성하는 시도 수 있습니다.

(텍스트로 바인딩 및 코어 데이터의 관계를 표현하기위한 표준을있을 필요가 있지만, 나는 우리가 통해 혼란 것 같아요.) 다소 해키 방법으로

2

나는 이것을 알아 냈어요 - 그것은 RTFM (및 이해-TFM)의 고전적인 사건이었다. 모두 ensuring KVC compliance으로 내려갔습니다. '플러그인'라는 배열이, 내가 간단하게 구현하는 데 필요한했다 PluginManager를 싱글에서는

: 나는/추가 플러그인을 제거하고 싶어 할 때

-insertObject:inPluginsAtIndex: 
-removeObjectFromPluginsAtIndex: 

그리고 그 방법을 사용합니다.

도움 주셔서 감사합니다.

+0

이것은 기념비적으로 도움이되었습니다. 자신의 질문에 답변 해 주셔서 감사합니다. 이것이 나에게 큰 걸음이었습니다. –