【问题标题】:Building nested NSMenu from NSDictionary从 NSDictionary 构建嵌套的 NSMenu
【发布时间】:2013-02-15 17:40:02
【问题描述】:

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

任何帮助都将不胜感激。

【问题讨论】:

  • 您能解释一下为什么您总是希望通过 NSDictionary 来操作菜单吗?我很难理解练习的重点,所以我觉得我给出的任何答案也可能会错过重点。
  • @Chuck 我试图在菜单中表示计算机 USB 树中的所有设备。因此,当 USB 树发生更改(例如,添加或删除设备)时,菜单也会相应更新。示例中的 Item1 将是控制器 1,Item 1.1 是连接到该控制器的第一个设备,依此类推。我试图“泛化”我的示例,以使其尽可能广泛地有用。

标签: objective-c cocoa nsdictionary nsmenu


【解决方案1】:

执行此操作的方法是将对象设置为菜单委托(请参阅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 测试对象(自定义对象或字典)的类型,并且为了处理任意嵌套,您可能想要使用处理单个字典的私有递归方法。

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

【讨论】:

  • 哇!这听起来是一个非常聪明和有效的解决方案。唉,我一点也不知道如何处理它......任何示例代码?教程?有什么可以给我一个杠杆让我开始的吗?
  • @headbanger Apple 的 SidebarDemo 示例似乎使用了 NSMenuDelegate developer.apple.com/library/mac/samplecode/SidebarDemo
猜你喜欢
  • 2012-07-30
  • 2018-03-30
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多