NSMenu与模态NSWindow中的视图

And*_*ang 5 macos cocoa objective-c

我有一个问题,当从模式NSWindow中的按钮显示选择器时,无法对NSMenuItem中的自定义视图执行选择器。

这似乎是可复制的问题,我已尽力简化了此问题。

显示方式窗口。

   [NSApp runModalForWindow:_modalWindow];
Run Code Online (Sandbox Code Playgroud)

模态窗口仅具有一个按钮,并且该按钮连接到以下选择器。

- (IBAction)modalButtonClicked:(id)sender
{
    NSMenu* aMenu = [[NSMenu alloc] initWithTitle:@"Menu"];

    NSMenuItem* aItemA = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
    NSMenuItem* aItemB = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
    NSMenuItem* aItemC = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];

    [aItemA setView:[NSButton buttonWithTitle:@"Item A" target:self action:@selector(menuButtonClicked:)]];
    [aItemB setView:[NSButton buttonWithTitle:@"Item B" target:self action:@selector(menuButtonClicked:)]];
    [aItemC setView:[NSButton buttonWithTitle:@"Item C" target:self action:@selector(menuButtonClicked:)]];

    [aMenu addItem:aItemA];
    [aMenu addItem:aItemB];
    [aMenu addItem:aItemC];

    [NSMenu popUpContextMenu:aMenu withEvent:[NSApp currentEvent] forView:sender];
}
Run Code Online (Sandbox Code Playgroud)

以及带有断点的菜单单击事件:

- (void)menuButtonClicked:(id)sender
{
    NSLog(@"%@", sender);
}
Run Code Online (Sandbox Code Playgroud)

单击该按钮将显示一个包含3个按钮的菜单,但是单击这些按钮中的任何按钮都不会发生任何反应。永远不会调用@(menuButtonClicked :)。这只是模态窗口的问题,但没有明显的原因。

Ste*_*cht 7

The documention https://developer.apple.com/documentation/appkit/nsmenuitem/1514843-target?language=objc states:

To ensure that a menu item’s target can receive commands while a modal dialog is open, the target object should return YES in worksWhenModal.

And indeed if one adds:

- (BOOL)worksWhenModal {
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

then it works and your method menuButtonClicked gives out something like:

2019-10-03 22:47:27.892005+0200 MenuTest[12876:454071] <NSButton: 0x600003505760>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的发现。谢谢! (2认同)