在应用程序中创建一个窗口最顶层

deo*_*ngh 3 macos cocoa osx-leopard window

在我的应用程序中,我有一组windows.I希望其中一个窗口在应用程序处于活动状态时始终处于最顶层.我尝试通过更改窗口级别来执行此操作,但未成功.

如果我放置NSNormalWindowLevel,然后点击我的应用程序的任何其他窗口,这个窗口进入后台.如果我使用除NSNormalWindowLevel之外的任何其他级别,那么即使我切换到其他应用程序,窗口仍然是最顶层的.我希望窗口在我的应用程序处于活动状态时才是最顶层的.如何在可可中执行此操作?

谢谢

Jac*_*rse 5

这是可能的,但只能以编程方式完成(这意味着不在Interface Builder中):

如果你有一个窗口,请使用

[window setLevel: NSMainMenuWindowLevel];
Run Code Online (Sandbox Code Playgroud)

如果您使用窗口控制器(NSWindowController),请使用

[windowController showWindow:self];
[windowController.window setLevel: NSMainMenuWindowLevel];
Run Code Online (Sandbox Code Playgroud)

一般情况下,您可以使用以下级别:

NSNormalWindowLevel       
NSFloatingWindowLevel   
NSSubmenuWindowLevel    
NSTornOffMenuWindowLevel
NSMainMenuWindowLevel   
NSStatusWindowLevel      
NSDockWindowLevel        
NSModalPanelWindowLevel   
NSPopUpMenuWindowLevel    
NSScreenSaverWindowLevel 
Run Code Online (Sandbox Code Playgroud)

如果您想在Interfacebuilder中显示最顶层的窗口(即菜单中的调用),请在App-Delegate中创建一个IBAction并分配对此操作的调用:

-(IBAction)showWindowCalledFromMenu:(id)sender {

   [self.window setLevel: NSMainMenuWindowLevel];
   [self.window makeKeyAndOrderFront:self];
}
Run Code Online (Sandbox Code Playgroud)

如果您希望窗口仅在应用程序处于活动状态时位于最顶层,则必须知道您的应用程序是否处于活动状态.在你的"main.xib"中观看"First Responder"中的"动作".您可以使用以下事件重置窗口级别:"deminiaturize","order Front","order Back"等等.

希望这可以帮助.玩得开心!


deo*_*ngh 5

最后,我通过使用函数setHidesonDeactivate并使用NSFloatingWindowLevel为窗口隐藏应用程序时隐藏了NSWindow.