我从我的主要NSWindow开了一个NSWindow。
DropHereWindowController *dropHereWindowController = [[DropHereWindowController alloc] initWithWindowNibName:@"DropHereWindow"];
[dropHereWindowController showWindow:nil];
我希望在将文件从finder拖到“DropHereWindow”时,此窗口保持在主窗口的顶部。然而,当打开取景器(不再有焦点)时,我的“DropHereWindow”就在我的主窗口后面。
我尝试过orderFront,makeKey,makeKeyAndFront,但没有任何帮助。 我该怎么办呢?
答案 0 :(得分:20)
方法:
- (void)setLevel:(NSInteger)windowLevel
NSWindow的子类:
[self setLevel: NSStatusWindowLevel];
或者只是使用:
[window setLevel: NSStatusWindowLevel];
可用级别:
答案 1 :(得分:10)
你说:
我尝试过orderFront,makeKey,makeKeyAndFront,但没有任何帮助。
然后:
方法:
- (void)setLevel:(NSInteger)windowLevel
它不起作用,单击取景器图标时窗口仍然在我的主窗口后面。
然后你做错了。
首先,无论如何,窗口不应自动落在另一个窗口后面。您(或用户)正在订购主窗口或您正在订购另一个窗口。我假设你没有做后者。
另一方面,orderFront:
,makeKeyAndOrderFront:
和setLevel:
可以正常工作。特别是,setLevel:
将窗口置于整个其他平面上,因此总是位于(或后面,取决于您选择的级别)无论你做什么,都有默认级别的窗口。
我猜你没有连接,或者你不小心断开了你的window
插座到窗口,这意味着你要发送orderFront:
/ setLevel:
个消息给nil
,什么都不做。通过将窗口记录到控制台,确保在发送 orderFront:
或setLevel:
消息的位置中填写您的插座。如果它显示“(null)”或“0x0”(取决于您如何记录它),那么您的插座保持nil
;检查它是否已连接到nib中,并且已经加载了nib /实例化了窗口控制器。
所有这一切,我不同意setLevel:
是正确的解决方案。如果您只想让一个窗口停留在特定的其他窗口前面,而不是将其放在另一个整个平面上,make it a child window。
答案 2 :(得分:5)
Swift 4.0,Xcode 9.0
您可以将level
的{{1}}属性设置为NSWindow
。例如,如果您是floating
的子类,则可以在覆盖init中设置它。
NSWindow
您也可以通过self.level = .floating
从NSWindow
获取NSWindowController
。
NSNormalWindowLevel
NSWindow对象的默认级别。
NSFloatingWindowLevel
适用于浮动调色板。
NSSubmenuWindowLevel
保留子菜单。与NSTornOffMenuWindowLevel同义,这是首选。
NSTornOffMenuWindowLevel
撕下菜单的级别。与NSSubmenuWindowLevel同义。
<强> NSModalPanelWindowLevel 强>
模态面板的级别。
<强> NSMainMenuWindowLevel 强>
为应用程序的主菜单保留。
NSStatusWindowLevel
状态窗口的级别。
NSPopUpMenuWindowLevel
弹出菜单的级别。
NSScreenSaverWindowLevel
屏幕保护程序的级别。
答案 3 :(得分:2)
这个对我有用,希望能有所帮助
[self.window makeKeyAndOrderFront:nil];
[self.window setLevel:NSStatusWindowLevel];
答案 4 :(得分:0)
使用CGWindowLevelKey
kCGMaximumWindowLevelKey
也可以。
[window setLevel:CGWindowLevelForKey(kCGMaximumWindowLevelKey)];
答案 5 :(得分:0)
NSStatusWindowLevel
可以正常工作,只是在启动应用程序后(或创建窗口之后)稍作延迟后使用它。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
{
self.view.window.level = NSStatusWindowLevel;
});