我面临着一种特殊的情况,导致我失去了几个小时的工作时间,我渴望了解幕后发生的事情。
这是我的简化视图:
struct ToggleTextButton: View {
var titles: [String]
var body: some View {
HStack {
ForEach(titles, id: \.self) { title in
Button(action: {
didSelect(title)
}) {
Text(title)
.padding()
.background(.blue)
.foregroundColor(.white)
.clipShape(Capsule())
}
}
}
}
func didSelect(_ title: String) {
print("Will select:", title)
}
}
这是一个简单的例子:
List {
ToggleTextButton(titles: ["A", "B", "C"])
// other ToggleTextButton...
}
当按下标题为“A”的按钮时,我期望输出为:
Will select: A
但是,这是实际输出:
Will select: A
Will select: B
Will select: C
此问题仅发生在列表内。这意味着如果我使用 ScrollView 和 VStack,一切都会按预期工作。
有人可以解释一下发生了什么事吗?
这是 SwiftUI 的限制(或者可能是一个功能:))。只要您的按钮样式设置为默认的
.automatic
,您就会看到此行为。
一旦添加 .buttonStyle(.borderless)
或任何其他按钮样式,您就会看到预期的行为。
作为参考,请参阅这个问题。