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