首页 > 解决方案 > 带有图标的 macOS 菜单栏文本

问题描述

在此处输入图像描述

正如您在图像中看到的那样,我希望能够做一个类似的,以创造一种方式,而不是只显示太阳的图标,还显示一个文本。

如下图所示,一个图标后跟一个文本。

在此处输入图像描述

但我只能做到这一点:

在此处输入图像描述

问题我想把图标放在文字的左边或右边,而不是上面,你能帮帮我吗?

附言

文本必须相应更改,我怎样才能使StatusBarController接收文本更改。

import AppKit
import SwiftUI

class StatusBarController {
    @ObservedObject var userPreferences = UserPreferences.instance
    private var statusBar: NSStatusBar
    private var statusItem: NSStatusItem
    private var popover: NSPopover
    
    init(_ popover: NSPopover) {
        self.popover = popover
        statusBar = NSStatusBar.init()
        statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
        
        if let statusBarButton = statusItem.button {
             if let _ = userPreferences.$inDownload {
                statusItem.button?.title = userPreferences.$percentualDownload
            }
            statusBarButton.image = #imageLiteral(resourceName: "Weather")
            statusBarButton.image?.size = NSSize(width: 18.0, height: 18.0)
            statusBarButton.image?.isTemplate = true
            statusBarButton.action = #selector(togglePopover(sender:))
            statusBarButton.target = self
            statusBarButton.imagePosition = NSControl.ImagePosition.imageLeft
        }
    }
    
    @objc func togglePopover(sender: AnyObject) {
        if(popover.isShown) {
            hidePopover(sender)
        }
        else {
            showPopover(sender)
        }
    }
    
    func showPopover(_ sender: AnyObject) {
        if let statusBarButton = statusItem.button {
            popover.show(relativeTo: statusBarButton.bounds, of: statusBarButton, preferredEdge: NSRectEdge.maxY)
        }
    }
    
    func hidePopover(_ sender: AnyObject) {
        popover.performClose(sender)
    }
}

我正在考虑使用类似的东西:

import EventKit
import ServiceManagement

private struct PreferencesKeys {
    static let backgroundIsTransparent = "backgroundIsTransparent"
    static let inDownload = "inDownload"
    static let percentualDownload = "percentualDownload"
}

class UserPreferences: ObservableObject {
    static let instance = UserPreferences()
    
    private init() {
        // This prevents others from using the default '()' initializer for this class.
    }
    
    private static let defaults = UserDefaults.standard
    
    @Published var backgroundIsTransparent: Bool = {
        guard UserDefaults.standard.object(forKey: PreferencesKeys.backgroundIsTransparent) != nil else {
            return true
        }
        return UserDefaults.standard.bool(forKey: PreferencesKeys.backgroundIsTransparent)
    }() {
        didSet {
            UserPreferences.defaults.set(backgroundIsTransparent, forKey: PreferencesKeys.backgroundIsTransparent)
        }
    }
    
    @Published var inDownload: Bool = {
        guard UserDefaults.standard.object(forKey: PreferencesKeys.inDownload) != nil else {
            return true
        }
        return UserDefaults.standard.bool(forKey: PreferencesKeys.inDownload)
    }() {
        didSet {
            UserPreferences.defaults.set(inDownload, forKey: PreferencesKeys.inDownload)
        }
    }
    
    @Published var percentualDownload: String = {
        guard UserDefaults.standard.object(forKey: PreferencesKeys.percentualDownload) != nil else {
            return "0%"
        }
        return UserDefaults.standard.string(forKey: PreferencesKeys.percentualDownload)!
    }() {
        didSet {
            UserPreferences.defaults.set(percentualDownload, forKey: PreferencesKeys.percentualDownload)
        }
    }
}

但我收到以下错误:

在此处输入图像描述

编辑:

我使用的第一个问题解决了:

statusBarButton.imagePosition = NSControl.ImagePosition.imageLeft
statusBarButton.imagePosition = NSControl.ImagePosition.imageRight

对于更新文本问题,我该怎么办?

标签: swiftmacosnsstatusitem

解决方案


推荐阅读