2

我已经构建了一个包含多个嵌套层的 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,所以我不会在没有任何知识的情况下处理这个问题,但我不知道如何以这种方式模拟绑定。

任何帮助将不胜感激。

4

1 回答 1

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并且为了处理任意嵌套,您可能需要使用私有的递归方法处理单个字典。

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

于 2013-02-15T18:18:58.667 回答