2012-11-17 5 views
0

NSArrayController 열이 많은 표가 동적으로 채워지고 있는데, 그 중 하나에는 팝업 버튼이 있습니다. 하위 버튼 (예 : 1을 내린 X1)을 사용하여 과학 변수를 표시해야하므로 팝업 버튼 셀의 내용은 NSAttributedString을 사용해야합니다.NSAttributedString에 대한 NSPopupButton 내용 바인딩

바인딩 NSAttributedString의 배열 팝업 셀 content values 그것은 단지 일반 NSString 이해 개체로서 UI의 무의미한를 산출한다.

팝업 버튼의 메뉴는 바인딩 할 수 없습니다 (즉, 바인딩을 통해 동적으로 할당 할 수 없음).

팝업 버튼 메뉴의 내용을 동적으로 바인딩 할 수도 없습니다.

NSAttributedString 개체를 사용하여 NSPopUpButtonCell 메뉴를 동적으로 채우는 방법 (다른 테이블 콘텐츠의 바인딩과 달라 붙는 방법)을 제안 할 수 있습니까? 메뉴에 기인 문자열을 표시하기 위해

답변

2

가 팝업 때, 나는 그 자체가 모든 옵션을 포함 NSAttributedStringsNSArray에 바인딩 된 NSArrayController에이 Content 바인딩을 가리키는 것이 팝업 셀을 포함하는 테이블 열을 설정하는 것이 좋습니다 다음 팝업 세포에 포함 된 NSMenu에 대리인을두고, 다음 위임이 같은 일을 :

- (void)menuNeedsUpdate:(NSMenu*)menu 
{ 
    for (NSMenuItem* item in menu.itemArray) 
     if ([item.representedObject isKindOfClass: [NSAttributedString class]]) 
     { 
      item.attributedTitle = item.representedObject; 
     } 
} 

다음은의 representedObject 특성에 해제 희롱 NSAttributedString 넣어 것이다 바인딩 NSMenuItem. 거기에서 찾을 수 있으며 attributedTitle 속성에 넣으면 속성이 지정된 문자열이 메뉴에 표시됩니다. 요약하면 메뉴에 그려진 메뉴 항목은 attributedTitle 속성이 적절히 설정된 상태에서 스타일이 지정된 텍스트를 그립니다.

메뉴가 이 아니고이 팝업 될 때 팝업 셀에서 의도 한 문자열 그리기를 만드는 것이 조금 더 복잡합니다. NSPopUpButtonCell은 그릴 수있는 NSMenuItem을 렌더링하여 나타납니다. 불행히도, 그 특정 NSMenuItem의 창조는 그것을 괴롭히지 않은 가치를 밀어 넣는 것을 포함하는 것처럼 보이지 않습니다. 대신 제목은 일반 텍스트 문자열로 전송 된 것으로 보입니다. 나는이에 대한 우아한 해결책을 고안 할 수 없었했지만, 나는 우아 해결 방법을 마련 않았다

먼저 올바르게 현재 선택된 기인 문자열을 그립니다 당신의 NSTableViewNSTextField 열을 추가 (즉, 속성). 해당 열을 숨 깁니다. 하위 클래스 NSPopUpButtonCell을 사용하거나 카테고리 및 관련 저장소를 사용하여 NSPopUpButtonCell에 새 개인 속성을 추가하십시오. 이 속성은 숨겨진 열에서 해당 셀을 가져 오는 데 드로우 타임에 사용할 수있는 블록을 보유합니다. NSTableViewDelegate을 추가하고 -tableView:dataCellForTableColumn:row:을 구현하십시오. pop-up 열이 호출되면 숨겨진 열에서 셀을 가져오고 하위 클래스의 속성으로 밀어 넣으려는 블록을 만듭니다. 그리기 시간에 셀 훼치러 블록이있는 경우 일반적으로 렌더링에 사용하는 menuItemtitle을 지우고 팝업 (팝업의 작은 화살표를 가져 오기 위해)을 호출 한 다음 서로 게이트 셀을 가져오고 무승부를 가져라. 코드의 모습은 다음과 같습니다.

나는 이것이 약간 더러운 느낌을 갖지만 인정합니다.github에 관련된 모든 바인딩이 포함 된 xib를 포함한 모든 코드를 게시했습니다. Example Project

희망이 있습니다.

+0

솔루션을 제공해 주셔서 감사합니다. 나는'NSPopUpButtonCell'가 제대로 업데이트되지 않을 것이므로 시간을 보내고 다양한 접근법을 시도한 후에'tableView : dataCellForTableColumn : row :'를 통해 테이블 ​​뷰 델리게이트의 팝업 버튼을 채우는 것으로 진행했다. 그냥 팝업의 선택된 인덱스 속성을 바인딩 .. – Jay