- macOS SwiftUI 封装组件之路径组件实现目录式菜单选择
- macOS SwiftUI 组件之 实用下拉菜单 (教程含源码)
- iOS macOS SwiftUI开发人员在2021年应关注的1
- macOS SwiftUI 开发教程之 popover通过选择i
- 状态栏(StatusBar)与导航栏(NavigationBar
- macOS SwiftUI 仿AppStore之实现搜索框附带下
- Android-推荐一个操作状态栏开源库(StatusBar)
- 定制十:隐藏导航栏或状态栏
- macOS SwiftUI 开发教程之 State如何解决默认选
- macOS SwiftUI 高级之组件大小联动实现灵活高度宽度下
介绍
MacOS开发中很多应用场景都需要用到状态栏菜单,Macos状态栏相关的完整实例网上资源仍然非常少,阅读本文您可以实现下列功能需求:
- 为MacOS应用添加状态栏图标项(使用NSStatusItem实现)
- 点击状态栏图标显示弹出菜单,菜单项包含打开主窗体、退出等(使用NSMenu实现)
- 点击弹出菜单中的菜单项恢复关闭的主窗体
-
点击dock应用图标恢复关闭的主窗体
pic20230422190226.png
创建MacOS下的SwiftUI工程
![](https://img.haomeiwen.com/i28966145/398cbcbc6a9d117c.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
添加状态栏的图标资源
![](https://img.haomeiwen.com/i28966145/75cb37af0bfc3be8.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,实际操作界面可能会出现两个应用窗口
网友评论