SwiftUI - две отдельные кнопки действуют как одна

Xcode 11.3 (11C29).  
macOS 10.15.2.

В представлении SwiftUI ниже есть две кнопки. Один печатает "ОК", а другой - "Отмена". Однако независимо от того, какая кнопка нажата, выполняются оба оператора печати. Почему так? (Я предполагаю, что это ошибка SwiftUI.)

struct ContentView: View {

    var body: some View {
        List {
            HStack {
                Button("OK") {
                    print("OK.")
                }
                Button("Cancel") {
                    print("Cancel")
                }
            }
        }
    }    
}

(Если либо List или HStack закомментирован, то каждая кнопка выводит только свое собственное утверждение.)

1 ответ

Вы можете использовать .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())
        }
    }
}

Как удобства, тоList инициализатор также позволяет использовать его, как указано выше ForEach view, если вы хотите иметь список, состоящий только из одного типа ячеек.

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

ИЛИ что-то вроде этого без:

struct ContentView: View {
    var body: some View {
        List {
            HStack {
                Button(action: { print("OK")}) {
                    Text("OK")
                }
                Button(action: { print("Cancel")}) {
                    Text("Cancel")
                }
            }
            .buttonStyle(BorderlessButtonStyle())
        }
    }
}
Другие вопросы по тегам