2013-02-15 46 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