从NSDictionary构建嵌套的NSMenu

时间:2013-02-15 17:40:03

标签: objective-c cocoa 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,所以我不会在没有任何知识的情况下接近它,但我还没有第一个想法如何以这种方式模拟绑定。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

执行此操作的方法是将对象设置为菜单委托(请参阅NSMenuDelegate)。我将菜单项的标签设置为唯一值,然后在启动期间找到该菜单项。我使用App Delegate作为菜单委托,然后通过实现以下委托方法来构建菜单:

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

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

您有任意复杂的字典结构的复杂性,因此您需要创建一个自定义类来存储每个菜单项(菜单文本和选择器,作为字符串,以及您可能需要的任何其他内容)。然后将这些项目和任何子词典存储在主词典中。

当您枚举字典时(在menu:updateItem:atIndex:shouldCancel:委托方法中),您将需要使用isKindOfClass测试对象的类型(自定义对象或字典),以便处理任意嵌套,您可能希望使用处理单个字典的私有递归方法。

祝你好运;这不简单,但肯定是可以实现的。