我将NSWindow的自定义子类的childWindow添加到parentWindow(也是NSWindow的自定义子类)。 childWindow具有NSBorderlessWindowMask,并且canBecomeKeyWindow:被覆盖以返回YES,而canBecomeMainWindow:返回NO。

childWindow设置为使用parentWindow调整大小。因此,我想创建一个幻觉,即childWindow的视图是parentWindow的一部分。主要思想是将由基于文档的应用程序创建的文档窗口安排在主窗口内,以提供选项卡式界面(就像在浏览器中一样)以在文档之间进行切换。

我的问题是,每当我单击childWindow的视图之一时,parentWindow(主窗口)就会失去焦点,并且交通灯按钮会变灰。这显然与我想要实现的目标相反。

我找到了这个答案:
Make NSView in NSPanel first responder without key window status

但是,即使我重写(主窗口的)isKeyWindow:总是返回YES,当我单击childWindow时,标题栏仍显示为灰色。

我还尝试遵循以下建议:
http://www.cocoabuilder.com/archive/cocoa/143945-non-focused-child-window.html

但是我不确定“将子窗口包括在其nextResponder之前的响应者链中”是什么意思。使用canBecomeKeyWindow:返回NO(对于childWindow),子级中的视图永远不能成为键,并且始终显示为灰色。

任何线索我在做什么错?

一个补充:是否可以在不提供childWindow键状态的情况下在childWindow FirstResponder中创建视图?

最佳答案

我通过模仿NSPopover的行为来完成这项工作。经调查,我发现一个弹出窗口(使用私有NSPanel子类“ _NSPopoverWindow”)认为它是键和主窗口,即使它不是[NSApp keyWindow]返回的窗口。

创建您自己的自定义NSPanel子类,将其附加到父窗口,然后这样重写以下方法:

- (BOOL)isKeyWindow {
    return YES;
}

- (BOOL)isMainWindow {
    return YES;
}

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow {
    return YES;
}

- (void)makeKeyWindow {
    [super makeKeyWindow];
    [self.parentWindow makeKeyWindow];
}
- (void)makeMainWindow {
    [super makeMainWindow];
    [self.parentWindow makeMainWindow];
}
- (void)becomeKeyWindow {
    [super becomeKeyWindow];
}

- (void)becomeMainWindow {
    [super becomeMainWindow];
    [self.parentWindow becomeMainWindow];
}

- (void)resignMainWindow {

}
- (void)resignKeyWindow {

}


cocoa - 允许childWindow中的 View 成为关键,而不会失去对parentWindow的关注-LMLPHP

07-27 22:03