如何使用swift关闭一个窗口,而不将同一应用程序的所有其他窗口放在macOS应用程序的前面



我有一个Mac应用程序,它有多个不同视图的窗口。

调用view.window?.close()(它关闭了一个打开的窗口,因为我的mac应用程序有多个打开的窗户(后,我如何阻止所有其他窗口出现在前面?

我希望我的其他窗户保持原样,不要移到前面。

例如,我有一个窗口分层,如下所示(从后到前(:我的应用程序窗口中有3个,然后是上面的2个Finder窗口,然后是我的前端应用程序窗口。当我关闭前车窗时,我想防止后面的3个车窗向前覆盖2个Finder车窗。

请注意,我使用的是Appkit/Cocoa。

您可以通过子类化NSWindow并在不希望出现的窗口中重写canBecomeMaincanBecomeKey来实现这一点。

一个简单的例子是创建一个基于文档的应用程序,该应用程序允许轻松创建多个窗口,每个文档一个窗口。在Document-nib文件中,选择文档窗口,打开Identity检查器,并将自定义类设置为自定义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子类中,设置为观察所有窗口的关闭。这样,只要其中一个窗口关闭,就会通知所有窗口。当窗口收到通知时,它们会检查是否是正在关闭的窗口。如果它们不是要关闭的,请将mdShouldBecomeMain标志临时设置为false,以便在canBecomeMaincanBecomeKey重写的属性中使用。当你关闭一个窗口时,应用程序会自动检查剩余的窗口,看看它们是否可以成为关键窗口或主窗口。通过覆盖这些值,可以防止窗口向前移动。

然而,请注意,您最终需要将该标志翻转回true(也许是在计时器上?(,否则即使直接点击窗口也根本无法将其向前移动。

最新更新