如何在 SwiftUI ForEach 内容中将多个按钮操作分开?

Posted

技术标签:

【中文标题】如何在 SwiftUI ForEach 内容中将多个按钮操作分开?【英文标题】:How do I keep multiple button actions separate in SwiftUI ForEach content? 【发布时间】:2020-03-31 21:21:05 【问题描述】:

我有一个带有复选框、标题和计时器图标的项目列表:

复选框是一个按钮,计时器图标是一个按钮,具有与之相关的独特操作。但是,如果我点击单元格内的任何位置,它会同时触发两个按钮操作。旨在使它们彼此独立运行,并且与单元中的分接头一样独立运行。如何修改以下代码以保持操作分开?

List 
      ForEach(tasks, id: \.self)  task in
            HStack 

                Button(action: 
                    task.isComplete.toggle()
                    try? self.moc.save()
                    print("Done button tapped")
                ) 
                    Image(systemName: task.isComplete ? "square.fill" : "square")
                
                .padding()

                Text(task.name ?? "Unknown Task")
                Spacer()

                Button(action: 
                    print("timer button tapped")
                ) 
                    Image("timer")
                    
            
        
        .onDelete(perform: deleteTask)
    

【问题讨论】:

【参考方案1】:

这是 List 的默认行为,它识别行中的 Button 并使整行处于活动状态,请改用 .onTapGesture,如下所示

List 
      ForEach(tasks, id: \.self)  task in
            HStack 

                Image(systemName: task.isComplete ? "square.fill" : "square")
                .padding()
                .onTapGesture 
                    task.isComplete.toggle()
                    try? self.moc.save()
                    print("Done button tapped")
                

                Text(task.name ?? "Unknown Task")
                Spacer()

                Image("timer")
                .onTapGesture 
                    print("timer button tapped")
                    
            
        
        .onDelete(perform: deleteTask)
    

【讨论】:

没有什么比解决问题更能让你开心的事情了。非常感谢!

以上是关于如何在 SwiftUI ForEach 内容中将多个按钮操作分开?的主要内容,如果未能解决你的问题,请参考以下文章

在 ForEach/ZStack (SwiftUI) 中将表达式分解为不同的子表达式

SwiftUI 中的 @Binding 和 ForEach

如何在 SwiftUI 中将内容添加到收藏列表?

如何在 SwiftUI 中将模糊效果作为背景?

如何在 SwiftUI 中嵌入 ForEach 的 HStack 中设置相对宽度?

如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI,Xcode 11 Beta 5)