2013-02-15 1 views
2

여러 개의 중첩 된 레이어가 포함 된 NSDictionary를 만들었으며이를 NSMenu로 복제하여 NSDictionary를 업데이트 할 때 NSMenu를 그대로 유지하려고합니다. 내가 포함하는 NSDictionary에있는 경우 예를 들어, : - 예상대로, 하위 메뉴해야한다 항목 1, 항목 2, 항목 3 항목 1, 항목 2NSDictionary에서 중첩 NSMenu 빌드

Item1 
|---Item 1.1 
|---Item 1.2 

Item2 
|---Item 2.1 
| |---Item 2.1.1 
|---Item 2.2 
|---Item 2.3 

Item3 

이 세 가지 항목으로 건설되고 내 메뉴 발생한다 항목 2.1 등.

항목 2를 삭제 한 다음 항목 2와 모든 하위 항목을 삭제해야합니다.

문제는 어떻게 접근해야하는지 잘 모르는 것입니다. NSMenu를 프로그래밍 방식으로 작성하는 방법을 알고 있으므로 전혀 지식이 없어도 접근 할 수는 없지만 이런 방식으로 바인딩을 시뮬레이트하는 방법을 처음으로 알지 못했습니다.

모든 도움을 주시면 감사하겠습니다.

+0

NSDictionary를 통해 항상 메뉴를 조작하려는 이유를 설명 할 수 있습니까? 나는 운동의 요점을 보는 데 약간의 어려움을 겪고 있습니다. 그래서 제가 준 답변이 아마도 요점을 놓치지 않을 것이라고 생각합니다. – Chuck

+0

@Chuck 메뉴의 컴퓨터 USB 트리에있는 모든 장치를 나타내려고합니다. 그래서 USB 트리가 변경되면 (예를 들어 장치가 추가되거나 제거 될 때) 메뉴가 그에 따라 업데이트됩니다. 예제의 Item1은 컨트롤러 1, 항목 1.1은 해당 컨트롤러에 연결된 첫 번째 장치 등입니다. 가능한 한 광범위하게 유용하도록 예제를 '일반화'하려고했습니다. – headbanger

답변

3

이 작업을 수행하는 방법은 개체를 메뉴 대리인으로 설정하는 것입니다 (NSMenuDelegate 참조). 필자는 메뉴 항목의 태그를 고유 한 값으로 설정 한 다음 시작할 때 해당 메뉴 항목을 찾습니다. 나는 메뉴 대리인으로 앱 위임을 사용하고 다음 대리자 메서드 구현하여 메뉴를 만들 : 당신은 임의의 복잡한 사전 구조의 추가 합병증이

- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu; 

- (BOOL)menu:(NSMenu *)menu 
    updateItem:(NSMenuItem *)item 
    atIndex:(NSInteger)index 
shouldCancel:(BOOL)shouldCancel; 

을, 그래서 당신은 각각 저장하는 사용자 정의 클래스를 작성해야 메뉴 항목 (메뉴 텍스트와 선택기를 필요에 따라 문자열로 표시) 그런 다음이 항목과 모든 하위 사전을 기본 사전에 저장하십시오.

menu:updateItem:atIndex:shouldCancel: 대리자 메서드에서 사전을 열거 할 때 isKindOfClass을 사용하여 개체 유형 (사용자 지정 개체 또는 사전)을 테스트해야하며 임의의 중첩을 처리하려면 다음을 사용하는 것이 좋습니다. 단일 사전을 처리하는 개인용 재귀 메서드

행운을 빕니다; 간단하지만 확실하게 달성 할 수는 없습니다.

+0

와우! 이는 매우 영리하고 효율적인 솔루션처럼 들립니다. 슬프게도, 나는 그것에 접근하는 가장 희미한 아이디어가 없다 ... 모든 샘플 코드? 자습서? 나에게 레버를주고 나를 시작하게하는 뭔가가 있니? – headbanger

+0

@headbanger Apple의 SidebarDemo 샘플이 'NSMenuDelegate'를 사용하는 것 같습니다. http://developer.apple.com/library/mac/samplecode/SidebarDemo/ – trojanfoe