SwiftUI — onTapGesture в HStack работает, пока не перестанет работать

#swiftui #hstack #swiftui-ontapgesture

#swiftui #hstack #swiftui-ontapgesture

Вопрос:

У нас есть пользовательский вид, который мы используем в формах (его основная особенность — возможность отображать красивую границу, если в форме есть ошибка проверки):

 struct ButtonNavigationLink: View {
    var label: String
    var markingType: MarkingType = .none
    
    var action: () -> Void
    
    var body: some View {
        GeometryReader { geometry in
            HStack {
                Text(label)
                .offset(x: 5, y: 0)
                
                Spacer()
                
                Image("PfeilRechts")
            }
            .frame(width: geometry.size.width   10, height: geometry.size.height, alignment: .leading)
            .padding(.trailing, 5)
            .border(markingType.getMarkingColor())
            .offset(x: -5, y: 0)
            // to allow click on the whole width
            .contentShape(Rectangle())
            .onTapGesture {
                print("in ButtonNavigationLink")
                self.action()
            }
        }
    }
}
 

onTapGesture работает хорошо, пока он больше не работает.
Это происходит, если мы открываем другие листы, а затем в конечном итоге переходим к этому.

Самое смешное, что — когда больше не работает — если вы прокручиваете, даже так слегка, форму, содержащую его, она снова начинает работать. Форма не отключена

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

1. Можете ли вы добавить код формы тоже? Не удается воспроизвести.

2. if просто используется в форме { Section { .. ButtonNavigationLink }} я только что заметил, что если я удалю все onTapGestures из всех наших HStacks, то это будет работать без проблем.

3. удаление всех onTapGestues также не решило проблему

4. если я удалю форму-оболочку, все будет работать нормально. действительно странно

5. решение, которое я нашел для работы, заключается в следующем: изменил все onTagGestures на кнопку с действием. Для кнопки PlainButtonStyle это вызвало бы ту же проблему, поэтому она также была удалена