Estou tentando escrever uma versão para macOS de https://stackoverflow.com/a/74935849/2178159 .
Pelo que entendi, eu deveria conseguir definir a menu
propriedade de um NSResponder
e ela será exibida automaticamente ao clicar com o botão direito.
Eu tentei algumas coisas:
A: definido menu
em um NSHostingController
's view
- quando eu faço isso e clico com o botão direito ou ctrl, nada acontece. B: definido menu
diretamente NSHostingController
- quando eu faço isso, ocorre um travamento Abstract method -[NSResponder setMenu:] called from class _TtGC7SwiftUI19NSHostingControllerGVS_21_ViewModifier_...__. Subclasses must override
C: chamada manual NSMenu.popup
em uma subclasse personalizada do método NSHostingController
ou NSView
's rightMouseDown
- nada acontece.
extension View {
func contextMenu(menu: NSMenu) -> some View {
modifier(ContextMenuViewModifier(menu: menu))
}
}
struct ContextMenuViewModifier: ViewModifier {
let menu: NSMenu
func body(content: Content) -> some View {
Interaction_UI(
view: { content },
menu: menu
)
.fixedSize()
}
}
private struct Interaction_UI<Content: View>: NSViewRepresentable {
typealias NSViewType = NSView
@ViewBuilder var view: Content
let menu: NSMenu
func makeNSView(context: Context) -> NSView {
let v = NSHostingController(rootView: view)
// option A - no effect
v.view.menu = menu
// option B - crash
v.menu = menu
return v.view
}
func updateNSView(_ nsView: NSViewType, context: Context) {
// part of option A
nsView.menu = menu
}
}