【问题标题】:Why is this NSMenuItem getting disabled when the window loses focus?当窗口失去焦点时,为什么这个 NSMenuItem 会被禁用?
【发布时间】:2023-03-17 13:05:01
【问题描述】:

我正在以编程方式创建一个带有NSMenuItemNSMenu。当应用程序的窗口处于活动状态时,NSMenuItem 被启用:

但是,一旦窗口失去焦点,菜单项就会被禁用:

这是我创建 NSMenu 的方式:

- (void)_quit
{
  [[NSApplication sharedApplication] terminate:nil];
}

- (NSMenu *)_setupMenu
{
  NSMenu *statusMenu = [[NSMenu alloc] initWithTitle:@"Demo"];
  NSMenuItem *quit = [[NSMenuItem alloc] initWithTitle:@"Quit" action:@selector(_quit) keyEquivalent:@""];

  [statusMenu addItem:quit];

  return statusMenu;
}

是什么导致了这个问题?无论应用程序是否处于焦点,我如何才能启用它?

【问题讨论】:

    标签: objective-c macos cocoa nswindow nsmenu


    【解决方案1】:

    因为菜单项是基于响应者链启用的。

    在您的情况下,您可以使用 terminate: 选择器代替您自己的选择器。
    由于这是在 NSApplication 类中声明的,它也是响应者链的一部分,因此该项目将始终处于活动状态。

    NSMenuItem *quit = [[NSMenuItem alloc] initWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@""];
    

    在此处了解更多信息:Cocoa Event Handling Guide

    【讨论】:

    • 如果您需要为此菜单项运行自己的代码,应用程序委托就在链中NSApp 之后。
    • @JoshCaswell:我应该如何修改委托以使其在我自己的代码上工作?
    • 在应用委托中实现一个与操作选择器同名的方法,并确保在响应者链的其他任何地方都没有其他同名的方法,@aam1r。
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2014-02-23
    相关资源
    最近更新 更多