2

我从一个故事板项目开始。我把菜单栏项目。单击菜单栏项时,会在 AppDelegate.swift 中触发以下方法。

func setWindowVisible() {
    NSApp.activateIgnoringOtherApps(ture)
    NSApp.mainWindow?.makeKeyAndOrderFront(self)
}

这将我的应用程序放在了前面。但是一旦我点击关闭按钮,窗口上的红色按钮,它就永远不起作用。

无论我关闭窗口,它都可以在基于非故事板的项目中工作。

我已经设定

NSApp.mainWindow?.releasedWhenClosed = false

在 applicationDidFinishLaunching()

任何人都可以帮助我吗?

4

2 回答 2

5

设置无效,因为此时该releasedWhenClosed属性为零。→ 执行此方法后创建窗口。applicationDidFinishLaunchingmainWindow

releasedWhenClosedInterface Builder 中创建窗口时,无论如何默认为 false。

关闭窗口后 mainWindow 属性可能为 nil,因为这样就没有 mainWindow 了。从文档:

当应用程序的故事板或 nib 文件尚未完成加载时,此属性中的值为 nil。当应用程序处于非活动状态或隐藏时,它也可能为 nil。

通过windowsNSApp.

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

如果您有多个窗口,则需要在数组中找到正确的窗口..

于 2016-05-30T12:26:27.903 回答
1

想要将 Kyle KIM 的答案提取到自己的答案中,因为上述具有数组访问的解决方案对我造成了异常。

在我的用例中,我使用这个键盘快捷键库将应用程序带到前台。

我还将它与新的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 和关键窗口检查都是必需的,因为当用户单击“关闭按钮”时,寡妇不再是关键但仍处于活动状态。该应用程序保持活动状态,直到他们单击其他应用程序。您可以通过窗口的焦点颜色看到这种情况。

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

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

    var body: some Scene {...}
}
于 2020-11-27T22:08:09.667 回答