美文网首页SwiftUI MacOS开发实例
MacOS SwiftUI开发:StatusBar与状态栏菜单

MacOS SwiftUI开发:StatusBar与状态栏菜单

作者: ArslanRobot | 来源:发表于2023-04-24 11:41 被阅读0次

介绍

MacOS开发中很多应用场景都需要用到状态栏菜单,Macos状态栏相关的完整实例网上资源仍然非常少,阅读本文您可以实现下列功能需求:

  • 为MacOS应用添加状态栏图标项(使用NSStatusItem实现)
  • 点击状态栏图标显示弹出菜单,菜单项包含打开主窗体、退出等(使用NSMenu实现)
  • 点击弹出菜单中的菜单项恢复关闭的主窗体
  • 点击dock应用图标恢复关闭的主窗体


    pic20230422190226.png

创建MacOS下的SwiftUI工程

pic20230422190717.png

SwiftUI中使用AppDelegate

以往在使用Xib或Storeboard创建的项目中最常见的应用入口文件AppDelegate不见了,创建好SwiftUI工程后,代码中没有找到AppDelegate相关内容,按如下方式添加AppDelegate:

import SwiftUI

@main
struct MacOS_SwiftUI_StatusBarApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}



SwiftUI提供了如下方式来实现AppDelegate
@NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate

添加状态栏的图标资源

pic20230422192115.png

实现AppDelegate

@MainActor
private final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
    var statusBarItem: NSStatusItem!
    var window: NSWindow?
    
    func applicationDidFinishLaunching(_ notification: Notification) {
        self.statusBarItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength))
        if let button = self.statusBarItem.button {
            button.image = NSImage(named: "statusicon")
        }
        
        //创建状态栏菜单
        var menu = NSMenu()
        menu.addItem(NSMenuItem(title: "打开主窗口", action: #selector(openMainWindow(_:)), keyEquivalent: ""))
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(title: "退出", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "Q"))
        self.statusBarItem.menu = menu
        
        NSApp.delegate = self
        window = NSApplication.shared.windows[0]
        window?.isReleasedWhenClosed = false
        window?.delegate = self
    }
    
    func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
        window?.makeKeyAndOrderFront(self)
        return true
    }
    
    @objc func openMainWindow(_ sender: AnyObject?) {
        window?.orderFrontRegardless()
    }
}

注意

NSApp.delegate = self
一定要添加,否则点击Dock图标无法进入applicationShouldHandleReopen方法,就会创建新的NsWindow,实际操作界面可能会出现两个应用窗口

相关文章

网友评论

    本文标题:MacOS SwiftUI开发:StatusBar与状态栏菜单

    本文链接:https://www.haomeiwen.com/subject/ensujdtx.html