【问题标题】:Searching NSMenuItem inside NSMenu recursively递归搜索 NSMenu 内的 NSMenuItem
【发布时间】:2014-09-25 16:58:02
【问题描述】:

itemWithTitle 方法在NSMenu 中定位菜单项。然而,它只在第一层内看起来。通过在所有嵌套的子菜单中搜索,我找不到一个现成的方法可以递归地完成相同的工作。或者,以某种方式等效地,递归地滑动NSmenu 的函数。

在我看来,这样的事情根本不存在。也许有一些与NSMenu 不直接相关的功能可以派上用场?

【问题讨论】:

  • 自己编写代码并不难。但更重要的是:你为什么想要这个?我怀疑您尝试完成的工作可以通过其他方式更好地完成,例如通过菜单验证。 (顺便说一下,为什么你觉得不可思议的可能不是。这个功能真的很少需要。)
  • @KenThomases 我知道自己做这件事并不难,但在我重新发明轮子之前,我想 100% 确定它还没有出现。程序员应该偷懒……
  • 如果您阅读我的其余评论,您会发现我实际上并没有建议您自己编写代码。我是说希望拥有此功能表明您正在以错误的方式做事(或尝试做事)。你正在与框架作斗争。
  • 嗯,这就是我要问的。有没有合适的方法来做到这一点,或者它会是一个笨拙的解决方法?我认为这是第二种情况。
  • 你还没有说出你真正想要做什么。 为什么您想在整个菜单层次结构中按标题搜索菜单项?找到菜单项后,您将如何处理?在网络上搜索“XY 问题”并阅读一些热门歌曲。

标签: cocoa recursion nsmenu nsmenuitem


【解决方案1】:

好的,因为我真的需要做这个笨拙的解决方法有很多具体的原因(超出了这篇文章的范围,而且很无趣),我最终自己编写了代码。

这里是sn-p:

NSMenuItem * mitem;

while (mitem) { // loop over all menu items contained in any submenu, subsubmenu, etc.

     // do something with mitem ....

     mitem = next_menu_item(mitem);
}

由功能驱动:

NSMenuItem * goto_submenu(NSMenuItem * mitem){

    NSMenu * submen = [mitem submenu];
    if (submen && [[submen title] isNotEqualTo:@""] && [submen numberOfItems])
        return goto_submenu([submen itemAtIndex:0]);

    return mitem;
};

NSMenuItem * next_menu_item(NSMenuItem * mitem){

    NSMenu * menu = [mitem menu];

    if ([menu indexOfItem:mitem]==([menu numberOfItems]-1)) //if is last item in submenu go to parent item
        return [mitem parentItem];

    return goto_submenu([menu itemAtIndex:([menu indexOfItem:mitem]+1)]);
};

【讨论】:

    【解决方案2】:
    @implementation NSMenu (UT)
    
    - (NSMenuItem *)itemWithTitle:(NSString *)title recursive:(BOOL)recursive {
        if (recursive) {
            for (NSMenuItem *item in self.itemArray) {
                if ([item.title isEqualToString:title]) {
                    return item;
                } else if (item.submenu) {
                    NSMenuItem *result = [item.submenu itemWithTitle:title recursive:recursive];
                    if (result) {
                        return result;
                    }
                }
            }
            return nil;
        } else {
            return [self itemWithTitle:title];
        }
    }
    
    - (NSMenuItem *)itemWithTag:(NSInteger)tag recursive:(BOOL)recursive {
        if (recursive) {
            for (NSMenuItem *item in self.itemArray) {
                if (item.tag == tag) {
                    return item;
                } else if (item.submenu) {
                    NSMenuItem *result = [item.submenu itemWithTag:tag recursive:recursive];
                    if (result) {
                        return result;
                    }
                }
            }
            return nil;
        } else {
            return [self itemWithTag:tag];
        }
    }
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多