watchOS 上的 SwiftUI 表单:点击手势间歇性失败

Posted

技术标签:

【中文标题】watchOS 上的 SwiftUI 表单:点击手势间歇性失败【英文标题】:SwiftUI Form on watchOS: tap gesture intermittently fails 【发布时间】:2019-08-01 16:41:58 【问题描述】:

在 watchOS 上,我正在尝试制作一个非常简单的表单,该表单由一个部分组成,其中包含一个文本值列表,我可以点击它来执行一些操作。代码如下。

struct ContentView: View 
    var body: some View 
        Form 
            Section(header: Text("Section 1")) 
                ForEach(0 ..< 3)  int in
                    Text("Hello \(int)")
                        .onTapGesture(count: 1) 
                            print("Tapped \(int)")
                        
                
            
        
    

当我在模拟器中运行此程序时,每个单元格点击只会根据需要间歇性打印。对于任何单元格,有时点击会发出打印,有时什么也不会发生。 (更多时候,什么都没有发生。只是偶尔会发出打印。)

是我做错了什么,还是 Apple Watch 模拟器中的错误?从 macOS Catalina beta 5 上的 Xcode 11 beta 5 开始,在 40mm 和 44mm 模拟器中都会出现。

【问题讨论】:

【参考方案1】:

为了回答我自己的问题,我提交了 Apple 反馈并得到了回复:

请注意,我们的工程团队已根据所提供的信息确定此问题的行为符合预期。

带有 onTapGesture() 修饰符的文本将在文本本身被点击时触发关闭。在您的示例项目中,点击文本本身会触发块,但在文本之外点击不会。如果您想要在点击 List 行时执行操作,请在 List 中放置一个 Button,其中 Text 作为 Button 的内容。

他们还提供了这个示例代码sn-p:

List 
    Section(header: Text("Section 1")) 
        ForEach(0..<3)  value in
               Button(action: 
                    print("Tapped \(value)")
                ) 
                    Text("Hello \(value)")
                
            
         
    

没有关于 Form 构造的答案,但 List 示例是有道理的,虽然乍一看有点不直观。

【讨论】:

以上是关于watchOS 上的 SwiftUI 表单:点击手势间歇性失败的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中隐藏 Picker 在 watchOS 上的焦点边界

在SwiftUI中点击watchOS应用程序时如何更改图像

使用 SwiftUI List()、ForEach()、.onTapGesture WatchOS6 传递值的问题

如何在 SwiftUI 中的 WatchOS 中实现 handleUserActivity?

SwiftUI PresentationButton 在 watchOS 上单次使用后停止运行

如何在 SwiftUI watchOS 上创建闹钟