Cocoa 在NSPanel第一响应器中创建NSView,但不显示键窗口状态
是否可以在不提供NSPanel密钥窗口状态(使主应用程序窗口退出密钥)的情况下,在NSPanel第一响应者内部提供NSView状态Cocoa 在NSPanel第一响应器中创建NSView,但不显示键窗口状态,cocoa,nsview,nswindow,nsresponder,nspanel,Cocoa,Nsview,Nswindow,Nsresponder,Nspanel,是否可以在不提供NSPanel密钥窗口状态(使主应用程序窗口退出密钥)的情况下,在NSPanel第一响应者内部提供NSView状态 谢谢。好吧,我最终弄明白了这一点,但这需要大量的研究,所以我将在这里发布详细信息,以防其他人遇到同样的问题。首先,有几个基本问题: 不可能让两个窗口同时处于关键位置 可以通过覆盖-isKeyWindow来伪装窗口,使其认为自己是键,但这不会给出窗口第一响应者状态中包含的视图 我的场景: 我在主应用程序窗口中添加了一个子窗口,其中包含一个NSTableView(原因是
谢谢。好吧,我最终弄明白了这一点,但这需要大量的研究,所以我将在这里发布详细信息,以防其他人遇到同样的问题。首先,有几个基本问题:
-isKeyWindow
来伪装窗口,使其认为自己是键,但这不会给出窗口第一响应者状态中包含的视图NSTableView
(原因是不相关的)。子窗口是一个带有NSBorderlessWindowMask
的NSPanel
。我想给出NSTableView
first responder状态,而不将面板设为关键窗口,因为它会将焦点从主窗口移开(而子窗口错觉的全部目的是使子窗口看起来像是主窗口的一部分)
我尝试的第一件事是通过重写isKeyWindow
返回YES
来愚弄表视图,使其认为它在键窗口内。这使得表视图的绘制看起来像是第一个响应者,但仍然没有给出第一个响应者的状态
解决方案:
因此,默认情况下,NSBorderlessWindowMask将不允许窗口成为关键帧。要使表视图成为第一个响应者,窗口必须是键,因此我在无边界窗口子类中重写了canBecomeKeyWindow
,以返回YES
。当然,这会从主窗口中删除密钥状态,这是我想要避免的事情之一。为了解决这个问题,我对我的main窗口进行了子类化,并覆盖了以下方法:
- (BOOL)isMainWindow
{
return YES;
}
- (BOOL)isKeyWindow
{
return ([NSApp isActive]) ? YES : [super isKeyWindow];
}
该子类检查应用程序是否处于活动状态,如果处于活动状态,则始终返回
YES
,这样无论应用程序中哪个窗口处于活动状态,主窗口的行为都将始终如同它仍然是键一样。这样会产生一种错觉,即您可以同时使用多个窗口作为关键点,并使您能够将关键点窗口状态切换到另一个窗口,而不会在主窗口上丢失它。希望这有帮助 真棒的回答。拯救了我的早晨。谢谢使用10.8这个解决方案是否可能不再有效?@PeterHosey:即使我覆盖isKeyWindow以始终返回“是”,当我点击面板时,主窗口也将被禁用。所以我无法重现“假造一扇窗户,让人以为它是钥匙”的可能性。在保持主窗口处于激活状态时,我无法从另一个窗口键进行查看。我是通过努力实现这一目标而发现的