ind*_*gie 5 cocoa nsview nswindow nsresponder nspanel
是否可以在NSPanel第一响应者状态内提供NSView而不提供NSPanel密钥窗口状态(使主应用程序窗口重新签名)?
谢谢.
好吧,我最终搞清楚了这一点,但是我花了很多研究所以我会在这里发布详细信息以防其他人遇到同样的问题.首先,一些基础知识:
-isKeyWindow但这不会使窗口中包含的视图成为第一响应者状态.我的场景:
我NSTableView在主应用程序窗口中添加了一个包含一个子窗口(原因是无关紧要).子窗口是一个NSPanel用NSBorderlessWindowMask.我想给出第NSTableView一个响应者状态而不将面板作为关键窗口,因为它从主窗口中取走焦点(并且子窗口错觉的整个点是使子窗口看起来像是主窗口的一部分) .
我尝试的第一件事是愚弄表视图,认为它是在键窗口内通过重写isKeyWindow返回YES.这使得表视图绘制就好像它是第一个响应者,但仍然没有给它第一个响应者状态.
解决方案:
所以默认情况下,NSBorderlessWindowMask不允许窗口成为键.要使表视图第一响应者,窗口必须是键,所以我canBecomeKeyWindow在无边框窗口子类中重写以返回YES.当然,这会从主窗口中取消关键状态,这是我想要避免的事情之一.为了解决这个问题,我将主窗口子类化并覆盖了以下方法:
- (BOOL)isMainWindow
{
return YES;
}
- (BOOL)isKeyWindow
{
return ([NSApp isActive]) ? YES : [super isKeyWindow];
}
Run Code Online (Sandbox Code Playgroud)
此子类检查应用程序是否处于活动状态,如果是,则始终返回,YES以便无论应用程序中的哪个窗口处于活动状态,主窗口将始终表现为仍然是关键.这种方式给人一种错觉,即你可以同时拥有多个窗口,并且可以将关键窗口状态转换到另一个窗口而不会丢失它在主窗口上.希望这可以帮助!