SwiftUI 列表中按钮操作的意外行为

问题描述 投票:0回答:1

我面临着一种特殊的情况,导致我失去了几个小时的工作时间,我渴望了解幕后发生的事情。

这是我的简化视图:

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,一切都会按预期工作。

有人可以解释一下发生了什么事吗?

list button swiftui
1个回答
0
投票

这是 SwiftUI 的限制(或者可能是一个功能:))。只要您的按钮样式设置为默认的

.automatic
,您就会看到此行为。 一旦添加
.buttonStyle(.borderless)
或任何其他按钮样式,您就会看到预期的行为。 作为参考,请参阅这个问题

© www.soinside.com 2019 - 2024. All rights reserved.