我已经构建了一个包含多个嵌套层的 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,所以我不会在没有任何知识的情况下处理这个问题,但我还没有第一个想法如何以这种方式模拟绑定(bind)。
如有任何帮助,我们将不胜感激。
最佳答案
执行此操作的方法是将一个对象设置为菜单委托(delegate)(请参阅 NSMenuDelegate
)。我将菜单项的标记设置为唯一值,然后在启动期间找到该菜单项。我使用应用程序委托(delegate)作为菜单委托(delegate),然后通过实现以下委托(delegate)方法来构建菜单:
- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu;
- (BOOL)menu:(NSMenu *)menu
updateItem:(NSMenuItem *)item
atIndex:(NSInteger)index
shouldCancel:(BOOL)shouldCancel;
您有任意复杂的字典结构,因此您需要创建一个自定义类来存储每个菜单项(菜单文本和选择器,作为字符串,以及您可能需要的任何其他内容)。然后将这些项目和任何子词典存储在主词典中。
当您枚举字典时(在 menu:updateItem:atIndex:shouldCancel:
委托(delegate)方法中),您需要使用 测试对象的类型(自定义对象或字典) isKindOfClass
并且为了处理任意嵌套,您可能希望使用处理单个字典的私有(private)递归方法。
祝你好运;这并不简单,但肯定是可以实现的。
关于objective-c - 从 NSDictionary 构建嵌套 NSMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14900284/