【问题标题】:How do you show a NSStatusBar item AND hide the dock icon?你如何显示一个 NSStatusBar 项目并隐藏停靠图标?
【发布时间】:2017-12-30 16:27:21
【问题描述】:

我尝试将“应用程序是代理”设置为 1,但状态栏项目消失了。当设置为 0 时,状态栏项目和停靠图标都将显示。如何显示状态栏项目但隐藏停靠图标?

我在awakeFromNib()applicationDidFinishLaunching() 中都尝试了以下AppDelegate.swift

//class scope    
let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)

//function scope    
self.statusItem.image = NSImage(named: "myImage")
let menu = NSMenu(title: "MyApp-Menu")
let menuItem = NSMenuItem(title: "title", action: nil, keyEquivalent: "")
menu.addItem(menuItem)
self.statusItem.menu = menu

【问题讨论】:

    标签: swift xcode macos user-interface cocoa


    【解决方案1】:

    已针对 Mac OS 10.14 更新

    在 AppDelegate 中:

    let statusItem = NSStatusBar.system.statusItem(withLength:NSStatusItem.squareLength)
    
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        if let button = statusItem.button {
            button.image = NSImage(named:NSImage.Name("StatusBarButtonImage"))
            button.action = #selector(launchFromTray)
        }
        constructMenu()
    }
    
    func constructMenu() {
        let menu = NSMenu()
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(title: "Show", action: #selector(launchFromTray), keyEquivalent: "w"))
        menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
    
        statusItem.menu = menu
    }
    

    您现在应该将Application is agent (UIElement) 设置为YES。应该可以正常工作,希望这会对某人有所帮助

    【讨论】:

      【解决方案2】:

      要隐藏停靠图标,必须将“Application is Agent”设置为“YES”,也可以将 app 设置为 UIElement Application:

       ProcessSerialNumber psn = { 0, kCurrentProcess };
       OSStatus rt = TransformProcessType(&psn, kProcessTransformToUIElementApplication);
      

      根据您提供的代码部分,我认为您所说的“状态栏项目消失”并不是真的消失,它只是菜单消失了。除非你写错代码,否则状态栏不会消失,但你的代码看起来不错。

      如果我认为正确,菜单会消失,因为该应用是代理应用。你需要做的只是让它再次成为一个 UI Element 应用程序:

      ProcessSerialNumber psn = { 0, kCurrentProcess };
          OSStatus returnCode = TransformProcessType(&psn, kProcessTransformToForegroundApplication);
      

      运行代理应用时不能显示菜单栏。代理应用和菜单栏之间只能选择一个。

      Agents include background-only applications, faceless background-only applications, and UI elements, but is not a full blown application with a menu bar

      【讨论】:

        猜你喜欢
        • 2021-10-02
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 2011-06-10
        • 1970-01-01
        相关资源
        最近更新 更多