我通过应用程序菜单
.commands
向 SwiftUI macCatalyst 应用程序添加“新建”文件菜单命令,格式如下:
@main
struct ApptestApp: App {
let myObject = MyObject()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(myObject) }
.commands {
CommandGroup(before: CommandGroupPlacement.newItem) {
Button(action:{
myObject.onAdd()
}, label: {
// (2)
Text("New")
})
.keyboardShortcut("n")
}
}
}
通过调用新类中定义的
ObservableObject
,如下所示:
class MyObject: ObservableObject {
func onAdd() {
print("This is where the App menu item 'New' lands")
// your code here
}
}
我的问题是我想真正调用另一个现有的 onAdd() 函数,如下所示,它是主 SwiftUI 视图的一部分,但是当我尝试从应用程序访问现有的
onAdd()
函数时,我收到“超出范围错误” .command
菜单。
public func onAdd() {
if bulleton == true {
items.append(Item(title: fullText, subtitle: fullText2, isExpanded: false,isChecked: false))
saveNotes()
} else {
if bulleton == false {
items.append(Item(title: fullText, subtitle: fullText3, isExpanded: false,isChecked: false))
Self.count = 1
Self.count += 1
Self.number += 1
saveNotes()
}
}
}
问题:如何从应用程序菜单访问主外部 SwiftUI 视图中的现有功能
.command
?
我在另一篇文章中看到了解决方案:
您必须通过
singleton引用
MyObject
类。这允许您指向同一个对象。
首先,在类中定义单例,如下所示:
class MyObject: ObservableObject {
// Define singleton
static let shared = MyObject()
func onAdd() {
// …
}
}
其次,在环境对象中引用单例:
@main
struct ApptestApp: App {
@State private let myObject = MyObject.shared // reference singleton here
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(myObject)
}
.commands {
// Coming up in next step …
}
}
}
现在您可以直接在
@EnvironmentObject
外部引用单例,如下所示:
CommandGroup(before: CommandGroupPlacement.newItem) {
Button(action:{
MyObject.shared.onAdd() // directly call singleton
} label: {
Text("New")
}
.keyboardShortcut("n")
}