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
,它嵌入在SwiftUINewView:NSViewRepresentable
结构中。我需要添加一个上下文菜单。但是当我尝试为oldNsView.menu
创建NSMenuItem
时,他们要求#选择器
,它需要@objc func…
才能工作。因为它位于SwiftUIView
compiler不允许执行此操作。(如果没有定义#选择器
,我可以看到菜单项标签(当然,它们是灰色的,什么也不做)
另一方面,如果我尝试将.contextMenu
添加到SwiftUInewView
中,则什么也不会发生。根本没有菜单。它可用于文本(…)
或其他通用视图,但不能用于自定义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")
}
}
}