5

是否可以在 NSPanel 第一响应者状态中提供 NSView 而不提供 NSPanel 键窗口状态(使主应用程序窗口辞职键)?

谢谢。

4

1 回答 1

8

好吧,我最终弄清楚了这一点,但它需要进行大量研究,所以我会在这里发布详细信息,以防其他人遇到同样的问题。首先,一些基础知识:

  1. 不可能同时有 2 个窗口实际上是关键
  2. 可以通过覆盖来伪造一个窗口,使其认为它是关键,-isKeyWindow但这不会给出窗口第一响应者状态中包含的视图。

我的场景:

我在主应用程序窗口中添加了一个包含 的子NSTableView窗口(原因无关紧要)。子窗口是一个NSPanelwith NSBorderlessWindowMask。我想在NSTableView不使面板成为关键窗口的情况下赋予第一响应者状态,因为它从主窗口中夺走了焦点(子窗口错觉的全部意义在于使子窗口看起来像是主窗口的一部分) .

isKeyWindow我尝试的第一件事是通过覆盖返回来欺骗表格视图,使其认为它位于关键窗口内YES。这使得表格视图绘制得好像它是第一响应者,但仍然没有给它第一响应者状态。

解决方案:

所以默认情况下,NSBorderlessWindowMask 不会让窗口成为​​键。为了使表格视图成为第一响应者,窗口必须是关键,所以我canBecomeKeyWindow在无边框窗口子类中覆盖了 return YES。当然,这会从主窗口中删除关键状态,这是我想要避免的事情之一。为了解决这个问题,我将我的窗口子类化并覆盖了以下方法:

- (BOOL)isMainWindow
{
    return YES;
}

- (BOOL)isKeyWindow
{
    return ([NSApp isActive]) ? YES : [super isKeyWindow];
}

这个子类检查应用程序是否处于活动状态,如果是,它总是返回YES,这样无论你的应用程序中哪个窗口处于活动状态,主窗口总是表现得好像它仍然是键一样。这种方式给人一种错觉,即您可以同时让多个窗口成为关键窗口,并使您能够将关键窗口状态转移到另一个窗口,而不会在主窗口上丢失它。希望这可以帮助!

于 2011-02-06T23:35:50.127 回答