如何将NSWindow置于最前并移到当前空间?

61

我正在使用这段代码弹出我的窗口:

[self.window makeKeyAndOrderFront:self];
[self.window setOrderedIndex:0];

但通常它会在其他窗口下面或者显示在我最后打开的其他桌面空间中。如何使它总是出现在用户的“前面”?

更新 我从之前提出的问题中找到了答案;使窗口显示在其他窗口的顶部: [NSApp activateIgnoringOtherApps:YES];

但如何将应用程序移动到用户当前的空间中?

8个回答

141
将您的应用程序置于前台:
[NSApp activateIgnoringOtherApps:YES];

Swift:

NSApp.activateIgnoringOtherApps(true)

Swift 3:

NSApp.activate(ignoringOtherApps: true)

7
谢谢!有没有关于如何将应用程序带到用户当前空间的想法? - Teo Choong Ping

30

也许你想要:

  [self.window setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces];

尝试使用其他的集合行为...我在10.5版本中发现NSWindowCollectionBehaviorMoveToActiveSpace有点问题,但现在可能会更好。


4
我该如何学习所有这些微妙的事情而不需要问别人?有时我在Cocoa开发中感到非常迷茫。 - Teo Choong Ping
2
当每个新的操作系统版本发布时,我倾向于阅读所有发行说明。里面有很多好的信息,而且只需要一个或两个小时。 - Nicholas Riley
可能是一个bug。Spaces从来都不是非常可靠或一致的,而且自从我写这篇文章以来,已经推出了几个新的OS X版本,每个版本都大幅改变了Spaces的行为。 - Nicholas Riley
@ULazdins 或许不是一个好的解决方案。但你可以尝试使用 [NSApp setActivationPolicy:] 并将 activationPolicy 设置为 NSApplicationActivationPolicyAccessoryNSApplicationActivationPolicyProhibited。这样做会导致你的应用程序菜单和 Dock 图标消失。 - Gon
2
嘿 @Gon!看起来我找到了一个解决方案(至少对我来说是有效的)。尝试使用 [self setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces | NSWindowCollectionBehaviorTransient]; [self setLevel:NSPopUpMenuWindowLevel]; - ULazdins
显示剩余5条评论

6

Swift 5.0 +

 NSWindow.orderFrontRegardless()

这并不适用于每种情况。但是这个版本是可以的 https://dev59.com/fHI-5IYBdhLWcg3wqqTh#1740423 - S.E.
你能提到一些这个方法不适用的情况吗? - arthas
当你正在构建一个".bundle"包(特别是用于登录窗口等),你不能使用它。你还需要以下代码行; func windowDidBecomeKey(_ notification: Notification) { guard let window = notification.object as? NSWindow else { return } guard window != self.window else { return } self.window = window } - S.E.

4
语法看起来与 Swift 2 有些不同:
NSApplication.sharedApplication().activateIgnoringOtherApps(true)

1
NSApp 只是返回 NSApplication.sharedApplication() 单例。 - Blaszard

4

Swift 3.0

NSApp.activate(ignoringOtherApps: true)

3
如果您希望您的应用程序即使被最小化也能够前台显示并且激活(获得焦点),那么请同时使用以下两个选项:
            NSApp.activate(ignoringOtherApps: true)
            NSApp.windows.first?.orderFrontRegardless()

如果您只想将其置于前台,而不想让它获得焦点,请使用以下代码:
            NSApp.windows.first?.orderFrontRegardless()

3
但是如何将应用程序移动到用户当前的Space呢? 你不需要这样做。Space 仅持有窗口而非应用程序。(这就是为什么 collectionBehavior 属性在 NSWindow 上而不是 NSApplication 上的原因。)

有一个名为“FloatingPanel”的NSWindow子类,可以放置在Spaces上方。https://gist.github.com/jordibruin/8ae7b79a1c0ce2c355139f29990d5702self.collectionBehavior.insert(.fullScreenAuxiliary)self.collectionBehavior.insert(.canJoinAllSpaces) - Eric_WVGG

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接