swift - 如何检测 SwiftUI 中的右键单击?

标签 swift event-handling mouseevent swiftui right-click

我在写 a simple Mines app帮助我了解 SwiftUI。因此,我希望主要点击(通常是 LMB)来“挖掘”(显示那里是否有地雷),然后二次点击(通常是人民币)来放置一个标志。

我有挖掘工作!但我无法弄清楚如何放置标志,因为我无法弄清楚如何检测二次点击。

Here's what I'm trying :

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))

正如我之前暗示的,handleUserDidTap 返回的函数在点击时被正确调用,但由 handleUserDidAltTap 返回的仅在我按住 Control 键时调用。这是有道理的,因为这就是代码所说的......但我没有看到任何可以使它注册二次点击的 API,所以我不知道还能做什么。

我也试过这个,但行为似乎相同:

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))

最佳答案

就目前 SwiftUI 的情况而言,这不是直接可能的。我相信它会在 future ,但目前,TapGesture显然主要集中在没有“右键单击”概念的 iOS 用例上,所以我认为这就是忽略这一点的原因。注意“长按”概念是一等公民形式的LongPressGesture ,而且这几乎只用于支持这一理论的 iOS 上下文中。
也就是说,我确实想出了一种方法来完成这项工作。您需要做的是退回旧技术,并将其嵌入到您的 SwiftUI View 中。

struct RightClickableSwiftUIView: NSViewRepresentable {
    func updateNSView(_ nsView: RightClickableView, context: NSViewRepresentableContext<RightClickableSwiftUIView>) {
        print("Update")
    }
    
    func makeNSView(context: Context) -> RightClickableView {
        RightClickableView()
    }
}

class RightClickableView: NSView {
    override func mouseDown(with theEvent: NSEvent) {
        print("left mouse")
    }
    
    override func rightMouseDown(with theEvent: NSEvent) {
        print("right mouse")
    }
}
我对此进行了测试,它在一个相当复杂的 SwiftUI 应用程序中对我有用。这里的基本方法是:
  • 将您的聆听组件创建为 NSView .
  • 用实现 NSViewRepresentable 的 SwiftUI View 包装它.
  • 将您的实现放入您想要的 UI 中,就像您对任何其他 SwiftUI View 所做的一样。

  • 不是一个理想的解决方案,但它现在可能已经足够了。我希望这可以解决您的问题,直到 Apple 进一步扩展 SwiftUI 的功能。

    关于swift - 如何检测 SwiftUI 中的右键单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59280263/

    相关文章:

    ios - 如何仅提供回调函数或 block 而不是创建符合 UIPickerViewDelegate 的对象?

    javascript - Paper JS 的编程点击事件

    java - 使用计时器更新 jframe 组件的位置

    Swift 包管理器 : create custom framework

    ios - 在 Firebase 返回结果后为变量赋值?

    ios - 我将如何以编程方式更改单元格的背景颜色

    javascript - 如何更改事件处理程序中传递的变量

    asp.net - 如何向asp.net中的动态控件添加事件处理程序以进行回发?除了使用Javascript之外,还有可能吗?

    jquery - Phonegap jQuery event.target 不工作

    java - 有没有办法防止光标点击某个字符串?