1

I'm writing a MacOS document app using the SwiftUI App lifecycle, and all the tricks I see here and elsewhere for sending a menu action to the active window depend on using platform specific implementation, which is (mostly) unavailable in a SwiftUI Lifecycle app. What I'm looking for is something like SideBarCommands(), which adds a menu item that, when selected by mouse or command key, toggles the appearance of the sidebar in the active window. All the Command examples I have seen thus far are trivial, none address a multi-document, multi-window use case.

Given a ContentView declared thusly:

struct ContentView: View {
    @Binding var document: TickleDocument

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

and a command, which is added via:

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")
                }
            }
        }
    }
}

What do I need to do so the button closure can call menuTickle() on the active ContentView? I know it can be done, because SideBarCommands() does it (unless Apple is using some non-public API to do it...).

For bonus points, tell me how I can detect whether or not I'm the active ContentView while body is being evaluated, and how I can detect when it changes! Tracking the Environment variable scenePhase is worthless - it always reports active, and never changes.

dang
  • 587
  • 1
  • 5
  • 10

1 Answers1

0

My question is a duplicate of this one.

The answer to that question contains a link to a solution that I have verified works, and can be found here

dang
  • 587
  • 1
  • 5
  • 10