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

时间:2016-10-20 21:54:23

标签: macos cocoa nspopover

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

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

一些popovers有用于输入用户输入的文本字段,我不想覆盖我的popover类来监听这个特定的热键关闭,但这是我现在唯一的想法< / p>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

这可以安全地关闭我的popovers

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