【问题标题】:Swift+Macos Auto close popover window when focus is lostSwift+Macos 失去焦点时自动关闭弹出窗口
【发布时间】:2019-12-29 07:25:26
【问题描述】:

我正在编写一个小应用程序,它在菜单栏中显示一个带有弹出视图的图标。

我以https://github.com/twostraws/SwiftOnSundays/tree/master/013%20TextTransformer为例。

我在测试应用程序中看到的一个区别是,当视图失去焦点时,弹出视图控制器不会被关闭。

这是我的应用委托,

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)

    let popupOver = NSPopover()

    @IBOutlet weak var menu: NSMenu!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        statusItem.button?.title = "FT";
        statusItem.button?.target = self;
        statusItem.button?.action = #selector(showMenu)

        let storyBoard = NSStoryboard(name: "Main", bundle: nil)

        guard let viewController = storyBoard.instantiateController(withIdentifier: "FTViewController") as? ViewController else {
            fatalError("Unable to find 'FTViewController'")
        }

        popupOver.contentViewController = viewController
        popupOver.behavior = .semitransient
    }

    func applicationDidResignActive(_ notification: Notification) {
        popupOver.close()
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }

    @objc func showMenu() {

        if(popupOver.isShown) {
            popupOver.close()
        }
        else {
            guard let statusButton = statusItem.button else {
                fatalError("Unable to find status button")
            }

            popupOver.show(relativeTo: statusButton.bounds, of: statusButton, preferredEdge: .maxY)
        }
    }
}

我尝试添加applicationDidResignActive,但只有当应用程序失去焦点时才会触发,所以如果我直接单击菜单栏项目并单击屏幕上的其他位置,我不会收到该事件。我引用的示例应用程序似乎没有连接这些事件,但仍按预期工作。

我刚刚开始 swift ui 编程,所以无法弄清楚我在这里缺少什么。

【问题讨论】:

  • 例子做popoverView.behavior = .transient
  • 我使用了.transient 并尝试了这个问题.semitransient 仍然在失去焦点时视图不会被关闭。

标签: swift macos storyboard


【解决方案1】:

不确定您是否仍在寻找解决方案,但我刚刚遇到同样的问题,我发现 this example 似乎可以完成这项工作。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多