2012-02-22 3 views
2

NSTableView의 배수는 NSCell입니다 (간접적으로는 NSTableColumn 경유). NSCell은 Flyweight 디자인 패턴을 따릅니다. 그들은 쿠키 커터입니다. 한 열에 하나의 셀이 있으며 각 행마다 그려야합니다. "값은 첫 번째 행에 그립니다. 여기 두 번째 행의 값 등이 있습니다." 이는 셀당 뷰 인스턴스가있는 뷰 기반 테이블 뷰와는 대조적입니다.setObjectValue : nil 만 호출하면 NSPopUpButtonCell이 올바르게 표시되는 이유는 무엇입니까?

NSPopUpButtonCell을 서브 클래스로 만들었으며 각각 setXxxValue: 메서드에 대해 NSLog();을 호출하고 메시지를 수퍼 클래스에 전달합니다. 새로운 행을 추가하거나 테이블을 새로 고칠 때 호출되는 유일한 메소드는 setObjectValue:입니다. 이것은 documentation에서 기대됩니다 ... 그러나 null은 그것에 전달 된 유일한 것입니다 !! 선택한 항목 인덱스가있는 NSNumber가 전달되어야합니다.

내 테이블이 좋습니다. 셀의 동작을 확장/변경하고 싶기 때문에 이것을 이해하려고 노력하고 있습니다 (분명히 그렇지 않은 경우 서브 클래스가 필요함).

질문 : 어떻게 가능합니까? 각 행에 대해 올바른 값을 그리려면 NSPopUpButtonCell을 값으로 설정하는 방법 바인딩을 고려해도, NSTableColumn은 무거운 짐을지고 있습니다. 내가 뭘 놓치고 있니?

+0

여기에 있습니다 : 메뉴 항목을 수정해야하는'NSPopUpButtonCell' 하위 클래스 인'setObjectValue :'는 모든 호출이 nil로만 이루어집니다.이 문제점에 대한 더 깊은 통찰력이 있으십니까? – Jay

답변

0

"테이블의 모든 행이 동일한 팝업 메뉴를 공유합니다."- 그렇게 할 필요는 없습니다.

테이블 열의 값 바인딩을 설정하는 것 외에도 배열 컨트롤러를 통해 셀의 내용 바인딩을 모델 개체의 배열 속성으로 설정하십시오.

모델의 옵션을 결정하는 코드를 유지할 수 있습니다 (단지 문자열 배열 만 작성). 그렇게하면 사용자 정의 하위 클래스가 필요하지 않습니다.

+0

1) 메뉴마다 행마다 다른 항목을 가질 수 있다는 것에 동의합니다.하지만 여전히 동일한 NSMenu 인스턴스입니다. 행마다'setMenu :'를 호출하는 것은 나에게 낭비가된다. 2) 나는 세포의 구속력을 필요로한다고 생각하지 않는다. 사용자 지정 바인딩이 없으면 NSTableColumn이 처리합니다 (사용자 지정 바인딩이없는 경우). –

+0

"setMenu 호출 :"이 무슨 뜻인지 잘 모르겠지만 바인딩이 각 행의 메뉴를 설정하지 않는다는 것을 알고있는 한. 메뉴가 실제로 표시 될 때만 설정합니다. – paulmelnikow