2013-02-15 75 views
2

我已經建立了一個NSDictionary包含幾個嵌套層,我想複製這個作爲NSMenu這樣,當我的NSDictionary更新,以便做我的NSMenu。舉例來說,如果我有一個包含一個NSDictionary:大廈嵌套NSMenu從NSDictionary的

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

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

Item3 

這將導致我的菜單正在與三個項目建成 - 第1項,第2項和第3項第1項和第2項應子菜單,也應項目2.1等等。

如果我刪除項目2項,然後2,和它的所有子菜單,也應刪除。

的問題是,我不知道如何處理這個。我知道如何以編程方式製作一個NSMenu,所以我沒有任何知識來解決這個問題,但我還沒有第一個想法如何以這種方式模擬綁定。

任何幫助將是非常感激地接受。

+0

你能解釋一下爲什麼你想操縱菜單通過一個NSDictionary在任何時候?我看到練習的重點有點麻煩,所以我覺得我給出的任何答案都可能會錯過這一點。 – Chuck 2013-02-15 18:06:01

+0

@Chuck我想要在菜單中的計算機USB樹中表示所有設備。所以當USB樹發生變化(例如添加或移除設備)時,菜單會相應更新。在示例中,Item1是控制器1,Item1.1是連接到該控制器的第一個設備等等。我試圖「泛化」我的例子,使其儘可能廣泛地有用。 – headbanger 2013-02-28 22:23:31

回答

3

做到這一點的方法是建立一個對象作爲菜單代表(見NSMenuDelegate)。我將菜單項的標籤設置爲一個唯一值,然後在啓動過程中找到該菜單項。我使用App代表作爲菜單的委託,然後通過實施以下委託方法建立菜單:

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

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

你有任意複雜的字典結構更加複雜,所以你需要創建一個自定義類存儲每個菜單項(菜單文本和選擇器,作爲一個字符串,以及任何你可能需要的東西)。然後將這些項目和任何子詞典存儲在主詞典中。

當你來到枚舉字典(在menu:updateItem:atIndex:shouldCancel:委託方法),就需要測試使用isKindOfClass對象(自定義對象或字典)的類型,並且爲了對付任意嵌套,你可能想使用一個處理單個字典的私有遞歸方法。

祝你好運;這並不簡單,但肯定可以實現。

+0

哇!這聽起來像是一個非常聰明和有效的解決方案。唉,我不知道如何處理它...任何示例代碼?教程?有東西給我一個槓桿,讓我開始? – headbanger 2013-02-15 21:34:15

+0

@headbanger蘋果的SidebarDemo示例似乎使用'NSMenuDelegate' http://developer.apple.com/library/mac/samplecode/SidebarDemo/ – trojanfoe 2013-02-16 09:10:04