6

我将 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 中创建视图?

4

1 回答 1

2

我通过模仿 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 {

}

NSWindow 与不窃取其主/关键状态的子窗口

于 2018-12-10T11:27:50.273 回答