按标题获取NSMenu树的NSMenuItem

时间:2012-03-24 13:11:18

标签: objective-c cocoa nsmenuitem nsmenu

我有一个NSMenu(让我们说主菜单),里面有很多NSMenu个,NSMenuItem位于不同的级别。

我希望能够获取指定树路径的NSMenuItem实例(其中包含相应NSMenus / NSMenuItems的标题)。

示例:

  

菜单:

     
      
  • 文件   
        
    •   
    • 打开   
          
      • 文档
      •   
      • 项目
      •   
    •   
    • 保存
    •   
    • 另存为...
    •   
  •   
     

路径: /文件/打开/文档

你会如何以最有效和可可友好的方式解决这个问题?

2 个答案:

答案 0 :(得分:3)

我认为最好的方法是通过指定标题或更好的自定义标记来获取NSMenuItem

#define kMenuFileNew 1
#define kMenuFileOpen 2

NSMenu *menu = [[NSMenu alloc] initWithTitle:@"File"];
NSMenuItem *item1 = [[NSMenuItem alloc] initWith..];
item1.tag = kMenuFileOpen;
[menu addItem:item1];


NSMenuItem* item2 = [menu itemWithTag:kMenuFileOpen];

答案 1 :(得分:1)

所以,这是;通过在Category上创建NSMenu并使用递归来解决。

代码:

- (NSMenuItem*)getItemWithPath:(NSString *)path
{
    NSArray* parts = [path componentsSeparatedByString:@"/"];
    NSMenuItem* currentItem = [self itemWithTitle:[parts objectAtIndex:0]];

    if ([parts count]==1)
    {
        return currentItem;
    }
    else
    {
        NSString* newPath = @"";

        for (int i=1; i<[parts count]; i++)
        {
            newPath = [newPath stringByAppendingString:[parts objectAtIndex:i]];
        }

        return [[currentItem submenu] getItemWithPath:newPath];
    }
}

用法:

NSMenuItem* i = [mainMenu getItemWithPath:@"View/Layout"];