SwiftUI调用StateObject报错:StatusBarController初始化缺少参数问题
解决方案
你遇到的报错是因为StatusBarController的指定初始化方法要求必须传入一个NSPopover类型的入参,你调用无参构造方法时缺少必填参数,因此触发编译错误。
方案1:调用构造方法时传入NSPopover实例
如果你需要自定义popover的配置,就手动创建实例后传入:
struct SettingsView: View { @StateObject var stat: StatusBarController init() { // 先创建并配置NSPopover let customPopover = NSPopover() customPopover.contentSize = NSSize(width: 300, height: 400) customPopover.behavior = .transient // 传入参数初始化StatusBarController _stat = StateObject(wrappedValue: StatusBarController(customPopover)) } // 剩余视图代码 // ..... }
方案2:给初始化方法添加默认参数(无侵入修改原有调用代码)
如果不需要自定义popover,你可以给StatusBarController的init方法添加默认参数,修改后原有无参调用代码无需改动即可正常运行:
class StatusBarController: ObservableObject { private var statusBar: NSStatusBar private var popover: NSPopover private var eventMonitor: EventMonitor? private var content: ContentView? // 给popover参数添加默认值,无参调用时自动使用默认创建的NSPopover init(_ popover: NSPopover = NSPopover()) { self.popover = popover statusBar = NSStatusBar.init() if let statusBarButton = statusItem.button { // 原有逻辑 // ........ } eventMonitor = EventMonitor(mask: [.leftMouseDown, .rightMouseDown], handler: mouseEventHandler) } // 剩余类代码 // ....... }
注意事项
StatusBarController属于全局管控系统状态栏的工具类,不建议在多个视图中重复初始化,会创建多实例导致逻辑冲突。推荐将其作为单例使用,或者在App入口处初始化后通过environmentObject注入到所有子视图中,避免重复创建。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

