[英]How to Close a window and not bring all other windows of the same app to the front in a macOS app using swift?
我有一个 Mac 应用程序,它有多个具有不同视图的 windows。
在调用view.window?.close()
(关闭其中一个打开的 windows 因为我的 mac 应用程序有多个打开的窗口)之后,我怎样才能阻止我的所有其他 windows 来到前面?
我希望我的其他 windows 留在原地而不是移动到前面。
例如,我有一个 windows 的分层,如下所示(从后到前):3 个应用程序 windows,然后是 2 个 Finder windows,然后是我的前端应用程序 window。当我关闭前端 window 时,我想防止后面 3 windows 从前来掩护 2 Finder windows。
请注意,我正在使用 Appkit/Cocoa。
您可以通过子类化NSWindow
并覆盖canBecomeMain
中您不想出现的 canBecomeMain 和canBecomeKey
来实现。
一个简单的示例是创建一个基于文档的应用程序,它允许轻松创建多个 windows,每个文档一个。 在文档 nib 文件 select 文档 window 中,打开身份检查器并将自定义 class 设置为自定义NSWindow
子类(例如MDWindow
)。
我的 Swift 有点生疏,但以下是一个简单的实现:
class MDWindow: NSWindow {
var mdShouldBecomeMain : Bool
override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask,
backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) {
mdShouldBecomeMain = true
super.init(contentRect: contentRect, styleMask: style, backing: backingStoreType, defer: flag)
}
override func awakeFromNib() {
NSLog("\(type(of: self)).\(#function)() \(self.title)")
NotificationCenter.default.addObserver(self, selector: #selector(mdWindowWillClose),
name: NSWindow.willCloseNotification, object: nil)
}
@objc func mdWindowWillClose(_ notification: Notification) {
NSLog("\(type(of: self)).\(#function)() \(self.title)")
let window = notification.object as! NSWindow
if (window != self) {
mdShouldBecomeMain = false
}
}
override var canBecomeMain : Bool {
NSLog("\(type(of: self)).\(#function)() \(self.title)")
return mdShouldBecomeMain
}
override var canBecomeKey : Bool {
NSLog("\(type(of: self)).\(#function)() \(self.title)")
return mdShouldBecomeMain
}
}
在awakeFromNib
的NSWindow
子类中,设置以观察所有 windows 的关闭。这样,只要其中一个关闭,所有 windows 都会收到通知。 当 windows 收到该通知时,他们会检查是否是他们正在关闭。 如果它们不是正在关闭的那个,请暂时将mdShouldBecomeMain
标志设置为false
,以便在canBecomeMain
和canBecomeKey
重写属性中使用。 当您关闭一个 window 时,应用程序会自动检查剩余的 windows 以查看它们是否可以成为 key 或 main。 通过覆盖这些值,您可以防止 window 出现。
但是请注意,您最终需要将该标志翻转回 true(也许是在计时器上?),否则即使直接点击 window 也根本不会将它们调回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.