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

tun*_*ten 5 cocoa focus childwindow nswindow nsresponder

我将NSWindow的自定义子类的childWindow添加到parentWindow(也是NSWindow的自定义子类).childWindow有NSBorderlessWindowMask和canBecomeKeyWindow:被重写以返回YES并且canBecomeMainWindow:返回NO.

childWindow设置为使用parentWindow调整大小.所以我想创建一个错觉,即childWindow的视图是parentWindow的一部分.主要思想是将基于文档的应用程序创建的文档窗口排列在主窗口中,以提供标签界面(就像在浏览器中一样)以在文档之间切换.

我的问题是每当我点击childWindow的一个视图时,parentWindow(主窗口)失去焦点,交通灯按钮变灰.这显然与我想要达到的目标背道而驰.

我找到了这个答案: 在没有关键窗口状态的NSPanel第一响应者中创建NSView

但即使我重写isKeyWindow :(主窗口)总是返回YES,但是当我点击childWindow时,标题栏会变灰.

我也尝试遵循这个建议:http: //www.cocoabuilder.com/archive/cocoa/143945-non-focused-child-window.html

但我不确定"在其nextResponder之前的响应链中包含子窗口"是什么意思.使用canBecomeKeyWindow:返回NO(对于childWindow),子节点内的视图永远不会成为键并且始终显示为灰色.

我有什么问题吗?

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

Zac*_*Zac 2

I got this working by mimicking the behaviour of NSPopover. On investigation I found that a popover (which uses a private NSPanel subclass "_NSPopoverWindow") believed it was the key & main window, even though it is not the window returned from [NSApp keyWindow].

Create your own custom NSPanel subclass, attach it to the parent window, and then override the following methods as so:

- (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 {

}
Run Code Online (Sandbox Code Playgroud)

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