为什么按钮不';嵌入SwiftUI表单时无法工作?

为什么按钮不';嵌入SwiftUI表单时无法工作?,swiftui,Swiftui,我在做一张SwitUI表格。我需要画一些自定义滑块。为此,我制作了一个视图(SliderView),多次将其包含在表单中。我花了一些时间来管理绑定,以便在父视图中获取滑块的值,但我能够做到:-) 我无法理解的一个大谜团是,为什么我在子视图中放置的按钮在嵌入表单时不起作用。他们在一个小房间里工作得很好。代码如下: // SliderView.swift import SwiftUI struct SliderView: View { var name: String var

我在做一张SwitUI表格。我需要画一些自定义滑块。为此,我制作了一个视图(SliderView),多次将其包含在表单中。我花了一些时间来管理绑定,以便在父视图中获取滑块的值,但我能够做到:-) 我无法理解的一个大谜团是,为什么我在子视图中放置的按钮在嵌入表单时不起作用。他们在一个小房间里工作得很好。代码如下:

//  SliderView.swift

import SwiftUI

struct SliderView: View {
    var name: String
    var min: Double
    var max: Double
    var step: Double
    var defaultValue: Double

    let numberFormatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = 2
        formatter.minimumIntegerDigits = 1
        return formatter
    }()


    @Binding var selectedValue: Double
    var body: some View {
        HStack{
            Text("\(name)")
            Slider(value: $selectedValue, in: self.min...self.max, step: self.step)
            Button(action: {
                if (self.selectedValue - self.step) >= self.min{
                    self.selectedValue = self.selectedValue - self.step
                }
            }) {
                Image(systemName:"minus.circle")
            }
            Text("\(numberFormatter.string(from: NSNumber(value: selectedValue)) ?? "")")
                .padding(5)
                .onAppear {
                    self.selectedValue = self.defaultValue
                }
            Button(action: {
                if (self.selectedValue + self.step) <= self.max{
                    self.selectedValue = self.selectedValue + self.step
                }
            }) {
                Image(systemName:"plus.circle")
            }


        }

    }
}

struct SliderView_Previews: PreviewProvider {
    @State static var myValue: Double = 1
    static var previews: some View {
        SliderView(name: "CPU", min: 1, max: 10, step: 0.5, defaultValue: 1, selectedValue: $myValue)
    }
}
只需在上面的代码中将“Form”替换为“VStack”,按钮就可以正常工作。有人能给我们点启示吗?我认为是关于表单中不同层次的东西。当我试图点击按钮时,整行的滑块似乎都被点击了,但什么也没发生。 我在MacOS 10.15测试版(19A558d)中使用Xcode 11 GM
提前谢谢

据我所知,当表单行包含接受点击手势(如按钮)的视图时,它们的行为会有所不同。当该行包含按钮时,当用户点击该按钮时,同一行中的所有其他内容也会收到一个点击手势。所以在上面的例子中,并不是你的按钮不起作用,实际上发生的是它们都在接收点击手势并执行动作,但是由于代码中的逻辑有效地抵消了另一个按钮的作用,所以看起来它们好像不起作用

为了帮助演示这一点,下面是我编写的一些测试代码:

    @State var count1 = 0
    @State var count2 = 0

    func buttonTest() -> some View {
        HStack {
            Button(action: {
                self.count1 += 1
            }) {
                Text("Button 1: \(count1)")
            }
            Spacer()
            Button(action: {
                self.count2 += 1
            }) {
                Text("Button 2: \(count2)")
            }
        }
    }

    var body: some View {
        VStack {
            buttonTest()
            Form {
                Section(header: Text("Test")) {
                    buttonTest()
                }
            }
        }
    }
如果您点击表单上方的任一按钮,它们将按预期独立工作,只增加它们自己的计数,但如果您点击表单中的任一按钮或行中的任何其他位置,则两个按钮的操作都会执行,并且两个计数都会增加

我不知道苹果为什么这么做,但我也在努力寻找解决这个问题的办法

编辑

多亏了,有了一个解决方案,但它使代码重用变得不那么优雅

因此,当按钮位于表单中时,需要将代码放入
.ontapsignate
处理程序中,但如果按钮位于表单外部,则需要
操作:
处理程序中的代码


我真的希望这不是苹果在表单上的长期立场:它违背了“一次写入,随处使用”的理念。

尝试在表单中的按钮中添加按钮样式修改器。这对我很有用:

Button(action: {}, label: {Text("Test")})
    ­­­­­.buttonStyle(PlainButtonStyle())

在使用MacOS 10.15的Xcode 11.1中也会发生同样的情况谢谢大家!!它工作得很好,我同意它有点奇怪。我希望苹果允许这两种解决方案。谢谢你的理智检查。截至2020年4月,这仍然是一个问题。截至2021年6月,即WWDC 2021前几天,这仍然是一个问题。为了使用ontapsignature,我将按钮替换为图像本身。这对我来说也很有效,但我想知道为什么。这也为我解决了这个问题。不知道为什么会有这种行为!它现在(2020年9月)似乎在SwiftUI中正常工作。刚刚尝试了使用和不使用
PlainButtonStyle()
,两者都有效。事实上,我不会使用
PlainButtonStyle()
,因为它会删除按钮的前景色(2020年12月),但如果没有这行代码,它(对我)仍然不起作用。而且:我仍然能够为基于图像的按钮使用前景色。