美文网首页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