1

我正在使用 SwiftUI 应用程序生命周期编写一个 MacOS 文档应用程序,我在这里和其他地方看到的用于将菜单操作发送到活动窗口的所有技巧都依赖于使用特定于平台的实现,这在 SwiftUI 生命周期应用程序中(大部分)不可用. 我正在寻找类似 SideBarCommands() 的东西,它添加了一个菜单项,当通过鼠标或命令键选择时,它会切换活动窗口中侧边栏的外观。到目前为止,我看到的所有命令示例都是微不足道的,没有一个解决多文档、多窗口的用例。

鉴于这样声明的 ContentView:

struct ContentView: View {
    @Binding var document: TickleDocument

    var body: some View {
        TextEditor(text: $document.text)
    }
    
    public func menuTickle() {
        document.text = "Wahoo!"
    }
}

和一个命令,通过以下方式添加:

struct TickleApp: App {
    public static var target:TickleDocument?
    
    var body: some Scene {
        let docGroup = DocumentGroup(newDocument: TickleDocument()) { file in
            ContentView(document: file.$document)
        }
        
        docGroup
            .commands {
                CommandMenu("App Tickles") {
                    Button("Tickle The ContentView") {
                      // Here's where I need to call menuTickle() on the active ContentView
                    }.keyboardShortcut("t")
                }
            }
        }
    }
}

我需要做什么才能使按钮关闭可以在活动的ContentView 上调用 menuTickle()?我知道它可以做到,因为它可以做到SideBarCommands()(除非 Apple 使用一些非公共 API 来做到这一点......)。

对于奖励积分,请告诉我如何body在评估时检测我是否是活动的 ContentView,以及如何检测它何时发生变化!跟踪Environment变量scenePhase是没有价值的——它总是报告活动,并且永远不会改变。

4

1 回答 1

0

我的问题是这个的副本

该问题的答案包含指向我已验证有效的解决方案的链接,可以在此处找到

于 2021-05-18T22:48:32.233 回答