SwiftUI - 两个单独的按钮合而为一

Vin*_*van 6 list button swiftui hstack

Xcode 11.3 (11C29).  
macOS 10.15.2.
Run Code Online (Sandbox Code Playgroud)

下面的 SwiftUI 视图中有两个按钮。一个打印“确定”,另一个打印“取消”。但是,无论按下哪个按钮,都会执行两个打印语句。 这是为什么?(我认为这一定是 SwiftUI 的 bug。)

struct ContentView: View {

    var body: some View {
        List {
            HStack {
                Button("OK") {
                    print("OK.")
                }
                Button("Cancel") {
                    print("Cancel")
                }
            }
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

(如果 theList或 theHStack被注释掉,则每个按钮仅打印其自己的语句。)

fuz*_*uzz 4

您可以使用它.buttonStyle(BorderlessButtonStyle())来达到所需的结果。如果您想在 中包含按钮List,它允许您单独点击以及点击行List

这是一个带有ForEach(..)循环的实现:

struct ContentView: View {
    var body: some View {
        List {
            ForEach(["My List Item Buttons"], id: \.self) {
                item in
                HStack {
                    Text("\(item)")
                    Spacer()
                    Button(action: { print("\(item) 1")}) {
                        Text("OK")
                    }
                    Button(action: { print("\(item) 2")}) {
                        Text("Cancel")
                    }
                }
            }
            .buttonStyle(BorderlessButtonStyle())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了方便起见,如果您想要一个仅包含单个单元格类型的列表,List初始化程序还允许您像上面的视图一样使用它。ForEach

List(["My List Item Buttons"], id: \.self) { item in
    Text("Row \(row)")
}
Run Code Online (Sandbox Code Playgroud)

或者类似的东西没有:

struct ContentView: View {
    var body: some View {
        List {
            HStack {
                Button(action: { print("OK")}) {
                    Text("OK")
                }
                Button(action: { print("Cancel")}) {
                    Text("Cancel")
                }
            }
            .buttonStyle(BorderlessButtonStyle())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 有很多方法可以解决这个问题。我自己在问题中提出了两个。真正的问题是为什么会出现这个问题。在上面的第二个答案中,通过明确说明默认边框样式解决了问题。这样的操作不应该改变按钮的行为,但它确实改变了。 (2认同)