仅当父VStack在SwiftUI中的列表内时,才会触发多个Button的动作处理程序

时间:2019-09-14 17:13:37

标签: ios xcode swiftui

案例1 :-当我在VStack中有多个按钮时,单击它们中的任何一个时,两个按钮的动作处理程序都会立即执行,只有当VStack是孩子时,才会发生这种情况列表。 对于例如-

List {
            VStack {
                Button(action: { print("A") }) {
                Text("Button A")
                }

                Button(action: { print("B") }) {
                Text("Button B")
                }
            }
        }

在这里,当您单击任何一个按钮(例如按钮B)时,o / p为:- A B

案例2 :-仅使用VStack尝试一下,效果很好。 对于例如-

VStack {
            Button(action: { print("C") }) {
            Text("Button C")
            }

            Button(action: { print("D") }) {
            Text("Button D")
            }
        }

在这里,当您单击任意一个按钮(例如按钮D)时,o / p为:- D

我是iOS编程的新手,请帮助我了解我要去哪里哪里还是SwiftUI的问题?

2 个答案:

答案 0 :(得分:1)

将按钮样式设置为不同于默认样式的样式,例如BorderlessButtonStyle()

struct Test: View {
  var body: some View {
    NavigationView {
      List {
        ForEach([
          "Line 1",
          "Line 2",
        ], id: \.self) {
          item in
          HStack {
            Text("\(item)")
            Spacer()
            Button(action: { print("\(item) 1")}) {
              Text("Button 1")
            }
            Button(action: { print("\(item) 2")}) {
              Text("Button 2")
            }
          }
        }
        .onDelete { _ in }
        .buttonStyle(BorderlessButtonStyle())
      }
      .navigationBarItems(trailing: EditButton())
    }
    .accentColor(.red)
  }
}

答案 1 :(得分:0)

列表中的按钮将无法正常使用。很可能是错误,但未正式确认。由于未得到确认,因此没有人知道何时/是否将其修复。

在此期间,您可以使用一个自定义按钮,如下所示。它复制了按钮的行为(点击时变色和变暗):

struct ContentView: View {
    @State private var flag = false

    var body: some View {
        List {
            VStack {
                MyButton(label: "Button A") {
                    print("A")
                }

                MyButton(label: "Button B") {
                    print("B")
                }
            }
        }
    }
}

struct MyButton: View {
    @State private var tapped = false
    let label: String
    let action: () -> ()

    var body: some View {
        let g = DragGesture(minimumDistance: 0, coordinateSpace: .local)
            .onChanged({ _ in
                withAnimation { self.tapped = true }
            })
            .onEnded({ _ in
                withAnimation { self.tapped = false }
                self.action()
            })

        return Text(label)
            .foregroundColor(Color(UIColor.link)
                .opacity(tapped ? 0.5 : 1.0))
            .gesture(g)


    }
}