有没有办法以编程方式在键事件而不是鼠标事件上关闭所有打开的 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;
+ }
+ }
我的 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;
+ }
+ }