有没有办法以编程方式在键事件而不是鼠标事件上关闭所有打开的 NSPopover?

Is there a way to programmatically close all open NSPopovers on key event, instead of mouse event?

我的 Cocoa 应用程序可以打开多个弹出窗口。
如果您单击其他任何地方,当前打开的弹出窗口将关闭(正常行为)

但是,我们还有一个可以更改应用程序状态的热键,我们希望弹出窗口能够关闭,类似于鼠标事件关闭它的方式。

一些弹出窗口有供用户输入的文本字段,我不想只覆盖我的弹出窗口 class 来监听这个特定的热键关闭,但这是我现在唯一的想法

一个想法是在您的应用程序更改状态时发送自定义 NSNotification,并让每个 NSPopover 侦听该通知并自行关闭。

想出了一个有趣的解决方案,就应用程序状态而言,它实际上非常安全。

我遍历响应链,寻找 NSPopover,如果找到,我传递 -cancelOperation 消息(在按下 ESC 键时发送)

这会安全地关闭我的弹出窗口

 +   NSWindowController* windowController = [MyMainWindowController sharedWindowController];
 +   NSResponder *responder = [[windowController window] firstResponder];
 +   while ((responder = [responder nextResponder]))
 +   {
 +      if( [responder isKindOfClass:[NSPopover class]] )
 +      {
 +         [[windowController window] cancelOperation:nil];
 +         break;
 +      }
 +   }