让NSWindow保持领先

时间:2011-03-19 19:43:45

标签: macos cocoa focus nswindow

我从我的主要NSWindow开了一个NSWindow。

DropHereWindowController *dropHereWindowController = [[DropHereWindowController alloc] initWithWindowNibName:@"DropHereWindow"];
[dropHereWindowController showWindow:nil];

我希望在将文件从finder拖到“DropHereWindow”时,此窗口保持在主窗口的顶部。然而,当打开取景器(不再有焦点)时,我的“DropHereWindow”就在我的主窗口后面。

我尝试过orderFront,makeKey,makeKeyAndFront,但没有任何帮助。 我该怎么办呢?

6 个答案:

答案 0 :(得分:20)

方法:

- (void)setLevel:(NSInteger)windowLevel

NSWindow的子类:

[self setLevel: NSStatusWindowLevel];

或者只是使用:

[window setLevel: NSStatusWindowLevel];

可用级别:

  • NSNormalWindowLevel
  • NSFloatingWindowLevel
  • NSSubmenuWindowLevel
  • NSTornOffMenuWindowLevel
  • NSModalPanelWindowLevel
  • NSMainMenuWindowLevel
  • NSStatusWindowLevel
  • NSPopUpMenuWindowLevel
  • NSScreenSaverWindowLevel
  • kCGDesktopWindowLevel

答案 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

There are different levels:

  

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)];

CGWindowLevelKey Reference

答案 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;
});