Cocoa 如何轻松关闭非关键窗口?
我正在实现一个无边框的子搜索结果窗口,该窗口浮动在NSSearchField下,并在用户键入时显示搜索结果。NSWindow不需要是键,因为NSSearchField将适当的命令(向上箭头、向下箭头、enter键)转发到窗口中的自定义搜索结果视图,用户可以在搜索过程中随时浏览结果。除了一个用例外,这一切都非常有效:当用户单击应用程序中的任何其他位置时,我想轻松关闭窗口 我通常会在Cocoa 如何轻松关闭非关键窗口?,cocoa,nswindow,Cocoa,Nswindow,我正在实现一个无边框的子搜索结果窗口,该窗口浮动在NSSearchField下,并在用户键入时显示搜索结果。NSWindow不需要是键,因为NSSearchField将适当的命令(向上箭头、向下箭头、enter键)转发到窗口中的自定义搜索结果视图,用户可以在搜索过程中随时浏览结果。除了一个用例外,这一切都非常有效:当用户单击应用程序中的任何其他位置时,我想轻松关闭窗口 我通常会在windowDidResignKey通知中执行此操作,但在这种情况下不会发送此消息,因为窗口从来都不是键。有没有其他方
windowDidResignKey
通知中执行此操作,但在这种情况下不会发送此消息,因为窗口从来都不是键。有没有其他方法可以轻松处理这种情况
--使用解决方案编辑--
使用Rob下面想法的一个变体,我简单地实现了
ControlTextDiEndEditing:
,这是NSSearchField的一个委托方法,在搜索字段失去焦点时调用它。如果搜索字段不是我的主父窗口的第一响应者,我将关闭搜索结果窗口 您可以子类化NSWindow
并覆盖makeFirstResponder:
,以便在第一响应程序发生任何更改时,如果结果窗口打开,结果窗口将关闭。当搜索字段处于活动状态时,第一响应者不应更改,因此只有在搜索字段的字段编辑器失去焦点时,窗口才应关闭。您可以将NSWindow
子类化,并覆盖makeFirstResponder:
,以便在第一响应者任何时候更改时,如果结果窗口打开,则关闭。当搜索字段处于活动状态时,第一响应者不应更改,因此只有在搜索字段的字段编辑器失去焦点时,窗口才应关闭。Oh duh,搜索字段的第一响应者状态为票证。谢谢哦,对了,搜索区域的第一响应者状态是票证。谢谢这是一个比我的答案更好的解决方案,因为它不需要子类化。这是一个比我的答案更好的解决方案,因为它不需要子类化。