从 SwiftUI 应用程序菜单.command 调用外部 SwiftUI 视图中的函数

问题描述 投票:0回答:1

我通过应用程序菜单

.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

function swiftui menu
1个回答
0
投票

我在另一篇文章中看到了解决方案:
您必须通过

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")
}
© www.soinside.com 2019 - 2024. All rights reserved.