NSWindow 关闭后 activateIgnoringOtherApps 和 makeKeyAndOrderFront 不工作

activateIgnoringOtherApps and makeKeyAndOrderFront not working after NSWindow is closed

我从一个故事板项目开始。我把菜单栏项目。 单击菜单栏项时,会在AppDelegate.swift.

中触发以下方法
func setWindowVisible() {
    NSApp.activateIgnoringOtherApps(ture)
    NSApp.mainWindow?.makeKeyAndOrderFront(self)
}

这使我的应用程序处于领先地位。但是一旦我点击关闭按钮,window 上的红色按钮,它就再也不起作用了。

无论我关闭 window.

,它过去都可以在基于非故事板的项目中工作

我设置了

NSApp.mainWindow?.releasedWhenClosed = false

在 applicationDidFinishLaunching()

谁能帮帮我?

applicationDidFinishLaunching中设置releasedWhenClosed没有效果,因为此时mainWindow属性为nil。 → window 是在执行此方法后创建的。

在 Interface Builder 中创建 window 时,releasedWhenClosed 默认为 false。

关闭 window 后,主窗口 属性 可能为零,因为那时不再有主窗口了。来自文档:

The value in this property is nil when the app’s storyboard or nib file has not yet finished loading. It might also be nil when the app is inactive or hidden.

我能够通过从 NSAppwindows 数组中访问 window 再次(关闭后)显示 window。

NSApp.activateIgnoringOtherApps(true)
NSApp.windows[0].makeKeyAndOrderFront(self)

如果您有多个 window,您需要在数组中找到正确的一个..

想将 Kyle KIM 的答案纳入自己的答案,因为上述数组访问解决方案对我造成了异常。

在我的用例中,我使用 this keyboard shortcuts library 将应用程序带到前台。

我还将它与新的 SwiftUI 应用程序 功能一起使用,幸运的是,它们可以协同工作——即使您单击关闭按钮,它也会再次调用。

class AppDelegate: NSObject, NSApplicationDelegate {

var window: NSWindow?

func applicationDidBecomeActive(_ notification: Notification) {
    self.window = NSApp.mainWindow
}

func applicationDidFinishLaunching(_ aNotification: Notification) {
    KeyboardShortcuts.onKeyUp(for: .toggleApp) {
        if !NSApp.isActive || !(self.window?.isKeyWindow ?? false) {
            NSApp.activate(ignoringOtherApps: true)
            self.window?.makeKeyAndOrderFront(self)
        } else {
            print("App already active")
        }
    }
}
}

!NSApp.isActive 和密钥 window 检查都是必需的,因为当用户单击“关闭按钮”时,寡妇 不再是密钥 但是仍然 活跃 。该应用程序将保持活动状态,直到他们单击其他应用程序为止。您可以看到 windows.

的焦点颜色发生了这种情况

请注意,此 AppDelegate 不是我应用程序的主要入口点,它与 swiftUI 一起使用:

@main
struct MainApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {...}
}