【问题标题】:activateIgnoringOtherApps and makeKeyAndOrderFront not working after NSWindow is closedNSWindow 关闭后 activateIgnoringOtherApps 和 makeKeyAndOrderFront 不起作用
【发布时间】:2020-11-28 06:31:32
【问题描述】:

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

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

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

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

我已经设置了

NSApp.mainWindow?.releasedWhenClosed = false

在 applicationDidFinishLaunching() 中

谁能帮帮我?

【问题讨论】:

    标签: macos cocoa nswindow nsstoryboard


    【解决方案1】:

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

    在 Interface Builder 中创建窗口时,releasedWhenClosed 无论如何都默认为 false。

    关闭窗口后mainWindow 属性可能为nil,因为那时没有mainWindow。来自文档:

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

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

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

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

    【讨论】:

    • 还是没有运气。我有一个 xcode 模板提供的窗口
    • 你能打印windows数组吗?
    • 我刚刚解决了。变量窗口:NSWindow!有了这个属性,window = NSApp.mainWindow!在 applicationDidBecomeActive() 中,然后在我的方法中使用 self.window.makeKeyAndOrderFront(self)。
    • 但是不知道window最好的地方是否= NSApp.mainWindow!在 applicationDidBecomeActive() 内部。先生有什么建议吗?
    • 我想这没问题,只要你只有一个窗口。当它更改时,此代码可能会中断。
    【解决方案2】:

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

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

    @main
    struct MainApp: App {
        @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
        var body: some Scene {...}
    }
    

    【讨论】:

    • 对于一个 SwiftUI 应用程序,这正是我的问题,也为我解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多