【问题标题】:Getting NSMenuItem of NSMenu tree by title按标题获取 NSMenu 树的 NSMenuItem
【发布时间】:2012-04-08 18:29:31
【问题描述】:

我有一个NSMenu(比如说主菜单),里面有很多NSMenus,还有不同级别的NSMenuItems。

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

示例:

菜单:

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

路径: /File/Open/Document

您将如何以最有效且对 Cocoa 友好的方式进行?

【问题讨论】:

    标签: objective-c cocoa nsmenuitem nsmenu


    【解决方案1】:

    我认为最好的方法是通过指定标题或更好的自定义标签来获取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];
    

    【讨论】:

    • 当然,但我想要做的不仅仅是获得一个 NSMenuItem;但是另一个子菜单中的 NSMenu 中的 NSMenuItem 等等...通过指定标题的路径... :-) (我现在正在处理它,让我们看看...)
    • 我成功了!!!是的!我将解决方案发布为社区的答案... :-)
    【解决方案2】:

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

    代码:

    - (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"]; 
    

    【讨论】:

    • 我能问一下你为什么这样做吗?似乎您应该已经知道菜单项,因为您在 IB 中制作了标题并且可以轻松地标记每个菜单。或者,如果您再次以编程方式执行它们,您应该知道每个人的 id...
    • @markhunte 好吧,我有一个非常扩展的主菜单,里面有很多嵌套的子菜单/项目等......并且想要一个快速的单行,这样我就可以引用任何菜单项,而不必为所有这些创建出口,或标记它们,等等......(我正在处理的代码库非常庞大,我试图让它尽可能地可读和最小......):-)跨度>
    • 如果用户的计算机被本地化为任何非英语语言,或者如果 Apple 在未来的操作系统更新中更改项目的标题,这将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多