【问题标题】:Override right click in SwiftUI在 SwiftUI 中覆盖右键单击
【发布时间】:2022-12-23 05:10:17
【问题描述】:

我尝试在右键单击时添加其他功能。不幸的是,这会破坏 .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-modifier,上下文菜单将再次工作。

【问题讨论】:

    标签: cocoa swiftui


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2022-07-12
      • 2020-10-18
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多