为什么NSWindow没有styleMask:NSTitledWindowMask不能是keyWindow?

iru*_*irc 8 macos cocoa nswindow

问题:我有一个窗口mainWindow和另一个childWindow添加到mainWindow.childWindow是一种WindowExt类.这个类我定义了[NSWindow becomeKeyWindow]必须在之后调用的catch方法调用[childWindow makeKeyWindow].如果我创建childWindow并尝试在下一个方向上使它成为keyWindow:

WindowExt *childWindow = [[WindowExt alloc] initWithContentRect:addedWindowRect
                           styleMask:NSBorderlessWindowMask | NSTitledWindowMask
                             backing:NSBackingStoreBuffered 
                               defer:NO];
[mainWindow addChildWindow:childWindow ordered:NSWindowAbove];
[childWindow makeKeyWindow];
Run Code Online (Sandbox Code Playgroud)

方法[WindowExt becomeKeyWindow]childWindow被称为-无一不精,childWindow成为keyWindow.

但是,如果我创建childWindow为

WindowExt *childWindow = [[WindowExt alloc] initWithContentRect:addedWindowRect
styleMask:NSBorderlessWindowMask 
backing:NSBackingStoreBuffered
defer:NO];
[mainWindow addChildWindow:childWindow ordered:NSWindowAbove];
[childWindow makeKeyWindow];
Run Code Online (Sandbox Code Playgroud)

没有NSTitledWindowMask,[WindowExt becomeKeyWindow]因为childWindow从未被称为 - childWindow不会成为关键窗口.

小智 24

这是一个Cocoa设计决定:默认情况下,没有标题或调整大小栏的窗口不能成为关键窗口.

如果您希望无标题窗口能够成为关键窗口,则需要创建子类NSWindow和覆盖-canBecomeKeyWindow,如下所示:

- (BOOL)canBecomeKeyWindow {
    return YES;
}
Run Code Online (Sandbox Code Playgroud)


tyi*_*ine 5

原来的

\n

@user557219 答案的Swift 5实现

\n
class NSPanelModified: NSPanel {\n    override var canBecomeKey: Bool {\n        return true\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

用法 \xe2\xa4\xb5\xef\xb8\x8e

\n
var panel = NSPanelModified()\nprint(panel.canBecomeKey) // true\n
Run Code Online (Sandbox Code Playgroud)\n
\n

更新:作为扩展

\n

我不知道为什么我不把它作为我的第一个答案。NSPanel 也可以使用扩展名 \xe2\xa4\xb5\xef\xb8\x8e 进行修改

\n
extension NSPanel {\n    open override var canBecomeKey: Bool {\n        return true\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

用法相同,只是没有自定义 NSPanel \xe2\xa4\xb5\xef\xb8\x8e

\n
var panel = NSPanel()\nprint(panel.canBecomeKey) // true\n
Run Code Online (Sandbox Code Playgroud)\n