Странное поведение кнопок в списке (SwiftUI)

В следующем коде SwiftUI я заметил неожиданное поведение.

Интересно, это ошибка, нормально ли это или мне не хватает чего-то очевидного.

List {
    ForEach(self.myList, id: \.self.name) {
        item in
        HStack {
            Spacer()
            Button(action: {
                print("Button One tapped!")
                ....
            }) {
                item.name.map(Text.init)
                    .font(.largeTitle)
                    .foregroundColor(.secondary)
            }
            Spacer()
            Button(action: {
                print("Button Two tapped!")
                ....
            }) {
                Image(systemName: "pencil.circle")
                    .font(.title)
                    .foregroundColor(.secondary)
                    .padding(.leading, 17)
            }
        }
    }
    .onDelete(perform: deleteFunc)
}

Вот что происходит при нажатии одной из двух кнопок подряд. Я вижу эти два сообщения:

Button One tapped!
Button Two tapped!

Я ожидаю увидеть только одно сообщение, в зависимости от нажатой кнопки.

Если порядок сообщений менялся в зависимости от нажатой кнопки; Я мог бы использовать одно или два логических значения, чтобы добиться желаемого конечного результата. Но два сообщения всегда появляются в одном и том же порядке.

У кого-нибудь был такой же опыт? Или кто нибудь видит ошибку?


person Michel    schedule 25.07.2020    source источник


Ответы (1)


Используйте PlainButtonStyle (или любой другой), потому что стиль кнопки по умолчанию определяется списком автоматически для выделения всей строки.

Вот упрощенная (из вашего кода) демонстрация:

struct DemoListWithButtons: View {
    var body: some View {
        List {
            ForEach(0..<5, id: \.self) {
                item in
                HStack {
                    Spacer()
                    Button(action: {
                        print("Button One tapped!")
                    }) {
                        Text("First")
                    }.buttonStyle(PlainButtonStyle()) // << here !!
                    Spacer()
                    Button(action: {
                        print("Button Two tapped!")
                    }) {
                        Text("Second")
                    }.buttonStyle(PlainButtonStyle()) // << here !!
                }
            }
        }
    }
}
person Asperi    schedule 25.07.2020
comment
да. Делать то, что вы пишете, даже только одной кнопкой, делает свое дело. - person Michel; 25.07.2020