objective-c - 从 NSDictionary 构建嵌套 NSMenu

标签 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,所以我不会在没有任何知识的情况下处理这个问题,但我还没有第一个想法如何以这种方式模拟绑定(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/

相关文章:

objective-c - 我可以释放在 block 运行之前使用它的 block 外部创建的对象吗?

ios - 减速时 UIScrollView 速度为 0

cocoa - 基础命令行工具,来自参数的文件

ios - 为什么 Swift 同时具有 NSDictionary 和 Dictionary 类?

swift - 从 '[NSObject : AnyObject]?' 转换为无关类型 'NSDictionary' 总是失败

ios - 从项目中的任何地方抛出异常

iOS/FBSDK - FBSDKProfile 在设备上为零,在模拟器上工作正常

cocoa - 如何在 Cocoa 中调整带有显示三角形的额外框的大小?

c# - MonoMac:其他对话框出现问题

dictionary - 将 NSDictionary 转换为 Swift 字典