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)
@user557219 答案的Swift 5实现
\nclass NSPanelModified: NSPanel {\n override var canBecomeKey: Bool {\n return true\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n用法 \xe2\xa4\xb5\xef\xb8\x8e
\nvar panel = NSPanelModified()\nprint(panel.canBecomeKey) // true\nRun Code Online (Sandbox Code Playgroud)\n我不知道为什么我不把它作为我的第一个答案。NSPanel 也可以使用扩展名 \xe2\xa4\xb5\xef\xb8\x8e 进行修改
\nextension NSPanel {\n open override var canBecomeKey: Bool {\n return true\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n用法相同,只是没有自定义 NSPanel \xe2\xa4\xb5\xef\xb8\x8e
\nvar panel = NSPanel()\nprint(panel.canBecomeKey) // true\nRun Code Online (Sandbox Code Playgroud)\n