Swift 如何使NewView:NSViewRepresentable中的ContextMenu可表示?

Swift 如何使NewView:NSViewRepresentable中的ContextMenu可表示?,swift,macos,swiftui,Swift,Macos,Swiftui,我有一个旧的OldNSView:NSView,它嵌入在SwiftUINewView:NSViewRepresentable结构中。我需要添加一个上下文菜单。但是当我尝试为oldNsView.menu创建NSMenuItem时,他们要求#选择器,它需要@objc func…才能工作。因为它位于SwiftUIViewcompiler不允许执行此操作。(如果没有定义#选择器,我可以看到菜单项标签(当然,它们是灰色的,什么也不做) 另一方面,如果我尝试将.contextMenu添加到SwiftUInew

我有一个旧的
OldNSView:NSView
,它嵌入在SwiftUI
NewView:NSViewRepresentable
结构中。我需要添加一个上下文菜单。但是当我尝试为
oldNsView.menu
创建
NSMenuItem
时,他们要求
#选择器
,它需要
@objc func…
才能工作。因为它位于SwiftUI
View
compiler不允许执行此操作。(如果没有定义
#选择器
,我可以看到菜单项标签(当然,它们是灰色的,什么也不做)

另一方面,如果我尝试将
.contextMenu
添加到SwiftUI
newView
中,则什么也不会发生。根本没有菜单。它可用于
文本(…)
或其他通用视图,但不能用于自定义
NSViewRepresentable
结构

所有
mouseUp(带事件)
mouseDown()
mouseDragged()
调用
super.mouse..(带事件)

如果我使用协调器

public class Coordinator: NSObject {
    ...
    //Compiler does't like if (_ sender: OldView).
    //It likes (_ sender: NSView), but in this case context menu is grayed-out
    @objc func changeXAxis(_ sender: NSView) {
        if let view = sender as? OldView {
            print ("changeXAxis") 
        }
    }
}

有没有办法做到这一点?

您有可表示的协调器概念来处理与
NSView
的交互

这是一个简单的演示。使用Xcode 11.4/macOS 10.15.5进行了测试


好的。但是如果我的
NewView:nsviewsrepresentable
实际上是
SpaceButton:nsviewsrepresentable{…}
,那该怎么办呢?我喜欢并且需要这个视图是通用的。
struct DemoViewWithMenu: NSViewRepresentable {
    func makeNSView(context: Context) -> NSView {
        let view = NSView()

        let menu = NSMenu()
        let item = menu.addItem(withTitle: "Do Action", action: #selector(Coordinator.action(_:)), keyEquivalent: "")
        item.target = context.coordinator
        
        view.menu = menu
        return view
    }

    func updateNSView(_ nsView: NSView, context: Context) {
    }

    func makeCoordinator() -> Coordinator {
        Coordinator()
    }

    class Coordinator: NSObject {
        @objc func action(_ sender: Any) {
            print(">> do action here")
        }
    }
}