我已经构建了一个包含多个嵌套层的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,所以我不会在没有任何知识的情况下接近它,但我还没有第一个想法如何以这种方式模拟绑定。
非常感谢任何帮助。
答案 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
测试对象的类型(自定义对象或字典),以便处理任意嵌套,您可能希望使用处理单个字典的私有递归方法。