是否可以在不提供 NSPanel 关键窗口状态(使主应用程序窗口退出关键)的情况下,为 NSPanel 内的 NSView 提供第一响应者状态?
Thanks.
好吧,我最终解决了这个问题,但是需要进行大量研究,因此我将在这里发布详细信息,以防其他人遇到同样的问题。首先,一些基础知识:
- 不可能同时有 2 个窗口成为关键
- 可以通过覆盖来伪造一个窗口,使其认为它是关键
-isKeyWindow
但这不会给出窗口中包含的视图第一响应者状态。
我的场景:
我添加了一个子窗口,其中包含NSTableView
进入我的主应用程序窗口(原因无关紧要)。子窗口是一个NSPanel
with NSBorderlessWindowMask
。我想给NSTableView
第一响应者状态,而不使面板成为关键窗口,因为它夺走了主窗口的焦点(子窗口幻象的全部目的是使子窗口看起来像是主窗口的一部分)。
我尝试的第一件事是通过覆盖来愚弄表格视图,使其认为它位于关键窗口内isKeyWindow
回来YES
。这使得表视图绘制得好像它是第一响应者一样,但仍然没有赋予它第一响应者状态。
解决方案:
所以默认情况下,NSBorderlessWindowMask 不会允许窗口成为关键。为了使表视图成为第一响应者,窗口必须是关键,所以我覆盖了canBecomeKeyWindow
在无边框窗口子类中返回YES
。当然,这剥夺了主窗口的关键状态,这是我想避免的事情之一。为了解决这个问题,我将我的main窗口并重写以下方法:
- (BOOL)isMainWindow
{
return YES;
}
- (BOOL)isKeyWindow
{
return ([NSApp isActive]) ? YES : [super isKeyWindow];
}
该子类检查应用程序是否处于活动状态,如果是,则始终返回YES
这样,无论应用程序中哪个窗口处于活动状态,主窗口始终会表现得好像它仍然是关键窗口一样。这种方式给人一种错觉,即您可以同时让多个窗口成为关键,并使您能够将关键窗口状态转移到另一个窗口,而不会在主窗口上丢失它。希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)