SwiftUI OnDelete не может обнаружить нажатие при добавлении onTapGesture

#ios #xcode #swiftui

#iOS #xcode #swiftui

Вопрос:

Я разрабатываю приложение для iOS со списком от SwiftUI. Я внедряю .OnDelete, чтобы позволить пользователю удалять строки. Однако я обнаружил, что когда я добавляю .onTapGesture в представление VStack, содержащее список, функция OnDelete не вызывается, когда пользователь нажимает кнопку «Удалить» после сдвига строки влево. Однако он все еще работает, когда пользователь сдвигает строку влево, чтобы удалить это. Кажется, что .onTapGesture блокируется.OnDelete для получения пользовательского ввода. Как это решить?

 NavigationView {
    VStack(alignment: .leading) {
        List {
            ForEach(things) { thing in
                Text(thing)
            }
            .onDelete(perform: { indexSet in
                things.remove(atOffsets: indexSet)
            })
        }
        .listStyle(SidebarListStyle())
        }
    .onTapGesture {
    }
}
  

Вот некоторый код, который может показать мою проблему.

Ответ №1:

Это, вероятно, бесполезно и очень сложно, но… Если у вас должна быть область, доступная для нажатия, вы можете поместить все в ZStack и поместить случайный вид поверх списка и сделать его доступным для нажатия. Затем вы могли бы установить достаточное количество отступов, чтобы освободить область, в которой будет нажата кнопка удаления, например:

         NavigationView {
        ZStack {
            List {
                ForEach(things, id: .self) { thing in
                    Text(thing)
                    }
                        .onDelete(perform: { indexSet in
                            things.remove(atOffsets: indexSet)
                        })
                    }
                        .zIndex(2)
                        .listStyle(SidebarListStyle())
            
                Rectangle()
                    .zIndex(3)
                    .fill(Color.red)
                    .padding(.trailing, 80)
                    .allowsHitTesting(true)
                    .onTapGesture {
                        print("Blocking you")
                    }
                }
        }
  

Я ввел цвет, чтобы вы могли точно видеть, где вы работаете, приведенный выше код даст вам примерно такой вид:

Открываемый прямоугольник в списке

Когда вы довольны областью, которую покрывает прямоугольник, вы можете просто установить непрозрачность на очень малую величину, просто заменив цвет на

 .opacity(0.000001)
  

или что-то в этом роде. К сожалению, нажатия не работают с модификаторами Color.clear или hidden().

Комментарии:

1. На самом деле я добавляю onTapGesture, чтобы отключить активную клавиатуру, поэтому область нажатия должна занимать весь экран. Все остальные кнопки в представлении, добавленном в onTapGesture, работают хорошо, кроме кнопки удаления.

2. @CollinZhang У меня тот же вариант использования, мне нужно, чтобы весь родительский элемент был интерактивным, чтобы отключить клавиатуру, но это не позволяет нажимать кнопку удаления. Вы когда-нибудь это понимали?