允许childWindow中的视图成为键,而不会失去对parentWindow的关注

时间:2012-11-19 11:22:35

标签: cocoa focus nswindow childwindow nsresponder

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

1 个答案:

答案 0 :(得分:0)

我通过模仿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 with child window that does not steal its main/key status