繁体   English   中英

如何使用 swift 关闭 window 而不是将同一应用程序的所有其他 windows 带到前面?

[英]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
}
}

awakeFromNibNSWindow子类中,设置以观察所有 windows 的关闭。这样,只要其中一个关闭,所有 windows 都会收到通知。 当 windows 收到该通知时,他们会检查是否是他们正在关闭。 如果它们不是正在关闭的那个,请暂时将mdShouldBecomeMain标志设置为false ,以便在canBecomeMaincanBecomeKey重写属性中使用。 当您关闭一个 window 时,应用程序会自动检查剩余的 windows 以查看它们是否可以成为 key 或 main。 通过覆盖这些值,您可以防止 window 出现。

但是请注意,您最终需要将该标志翻转回 true(也许是在计时器上?),否则即使直接点击 window 也根本不会将它们调回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM