在SwiftUI中覆盖右键单击功能

3

我尝试在右键单击时添加附加功能,但不幸的是这将破坏.context修饰符,我不明白为什么会这样。这是我正在使用的代码:

extension View {
    func onRightClick(handler: @escaping () -> Void) -> some View {
        modifier(RightClickHandler(handler: handler))
    }
}

struct RightClickHandler: ViewModifier {
    let handler: () -> Void
    func body(content: Content) -> some View {
        content.overlay(RightClickListeningViewRepresentable(handler: handler), alignment: .center)
    }
}

struct RightClickListeningViewRepresentable: NSViewRepresentable {
    let handler: () -> Void
    func makeNSView(context: Context) -> RightClickListeningView {
        RightClickListeningView(handler: handler)
    }
    func updateNSView(_ nsView: RightClickListeningView, context: Context) {}
}

class RightClickListeningView: NSView {
    let handler: () -> Void
    
    init(handler: @escaping () -> Void) {
        self.handler = handler
        super.init(frame: .zero)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func rightMouseDown(with event: NSEvent) {
        handler()
        super.rightMouseDown(with: event)
        if let menu = super.menu(for: event) {
            print(menu)
            let location = event.locationInWindow
            menu.popUp(positioning: nil, at: location, in: self)
        }
    }

}

后来我得到了这个:

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .contextMenu(menuItems: {
                Button("Test") { }
            })
            .onRightClick {
                print("right click detcted")
            }
            .padding()
    }
}

如果我移除 onRightClick 修饰符,右键菜单就又可以正常工作了。

1个回答

2

我知道你已经问了6个月,但是如果你交换修饰符,它就会按预期工作(假设你想检测上下文菜单何时打开)。当你右键点击时,上下文菜单将打开并检测到右键点击。希望这可以帮助你!

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .onRightClick {
                print("right click detcted")
            }
            .contextMenu(menuItems: {
                Button("Test") { }
            })
            .padding()
    }
}

Right clicking on Hello world will yield this result


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接