В SwiftUI, как я могу отличить общее нажатие от нажатия кнопки в ячейке?

#ios #swiftui

Вопрос:

У меня есть список с каждым элементом, который имеет навигационную ссылку и представление ячейки в ZStack.

 List(inventory.items) { food in
    ZStack {
        NavigationLink(
            destination: InventoryEditionView(food: food, index:inventory.items.firstIndex(of: food)!))
                         {
                         EmptyView()
                         }
                        .disabled(!model.seletedFoodItems.isEmpty)

        InventoryListCell(food: food, model: model)
                        
    }
 }
 

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

 Button{
            
            if model.isSelected(food: food) {
                model.deselect(food)
            } else {
                model.select(food)
            }

        } label: {
            Image(systemName: "checkmark.circle")
                .frame(width: 44, height: 44)
                .imageScale(.large)
                .foregroundColor(model.isSelected(food: food) ? Color("primary") : Color(.systemGray))
            
        }
 

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

Ответ №1:

вы могли бы попробовать использовать

 .allowsHitTesting(false) 
 

чтобы «отключить» выделение при нажатии на представления, которые вы
не хотите инициировать выделение.

Ответ №2:

Вместо кнопки я просто использовал изображение и настроил его цвет в onTapGesture.

  Image(systemName: "checkmark.circle")
                .frame(width: 44, height: 44)
                .imageScale(.large)
                .foregroundColor(model.isSelected(food: food) ? Color("primary") : Color(.systemGray))
                .onTapGesture {
                    if model.isSelected(food: food) {
                        model.deselect(food)
                    } else {
                        model.select(food)
                    }
                }