Навигационная ссылка SwiftUI, содержащая кнопку

У меня есть список SwiftUI, который выглядит так:

List {
    ForEach(items) { item in
    NavigationLink(destination: EditItemView(item: item)) {
        ItemView(item: item, buttonAction: {
            // Do something
        })
    }
}

где ItemView:

struct ItemView: View {
    var item: Item
    let buttonAction: () -> Void

    var body: some View {
        HStack(alignment: .center) {
            Text(item.tile)
                    .font(.headline)
            Spacer()
            Button(action: buttonAction,
                   label: {
                    Image(systemName: "plus.circle")
                   })
                  .padding(.horizontal)
        }
    }
}

Однако всякий раз, когда я нажимаю на кнопку, вместо выполнения действия кнопки он переходит к EditItemView, которое является действием ссылки навигации.

Итак, как я могу заставить кнопку выполнять действие внутри навигационной ссылки?

Или, если это невозможно, как я могу сделать так, чтобы нажатие на представление элемента выполняло одно действие, а нажатие кнопки выполняло другое действие?


person nikmin    schedule 08.08.2020    source источник


Ответы (1)


Возможный подход - изменен только ItemView путем замены кнопки по умолчанию жестом касания (проверено с Xcode 12 / iOS 14)

struct ItemView: View {
    var item: Int
    let buttonAction: () -> Void

    var body: some View {
        HStack(alignment: .center) {
            Text("Item \(item)")
                .font(.headline)
            Spacer()
            Image(systemName: "plus.circle")
                .padding(.horizontal).contentShape(Rectangle())
                .highPriorityGesture(TapGesture().onEnded(buttonAction))
        }
    }
}
person Asperi    schedule 08.08.2020