NavigationLink + Text.onTapGesture Colliding

Эта проблема заключается в том, что при нажатии на Text в представлении для NavigationLink onTapGesture получает приоритет и игнорирует NavigationLink. Я пробовал использовать simultaneousGesture, но проблемы все еще возникают.

Вот бит кода NavigationView / List / NavigationLink:

NavigationView {
            List {
                ForEach(gameStore.games) { game in                    
                    NavigationLink(destination: EmojiMemoryGameView(viewModel: game)
                                    .navigationBarTitle(self.gameStore.name(for: game))
                    ) {
                        EmojiThemeEditorView(game: game, isEditing: self.editMode.isEditing)
                    }                    
                }
                .onDelete { indexSet in
                    indexSet.map { self.gameStore.games[$0] }
                        .forEach { game in
                            self.gameStore.removeGameTheme(game)
                        }
                }
            }
            .navigationBarTitle(self.gameStore.name)
            .navigationBarItems(
                leading: Button(action: {
                    self.gameStore.addGameTheme()
                }, label: {
                    Image(systemName: "plus").imageScale(.large)
                }),
                trailing: EditButton()
            )
            .environment(\.editMode, $editMode)

А вот тело EmojiThemeEditorView:

var body: some View {
        Text(game.theme.themeName).foregroundColor(game.theme.colorToUse).font(.largeTitle)
//            .simultaneousGesture(TapGesture().onEnded { // tried this and did not work
            .onTapGesture {
                if (isEditing) {
                    self.showThemeEditor = true
                }
            }
            .popover(isPresented: $showThemeEditor) {
                EmojiThemeEditorOptionView(isShowing: $showThemeEditor).environmentObject(self.game.theme)
            }
    }

Как правило, нажатие на текст не приводит к переходу к NavigationLink. Вот пример:

введите описание изображения здесь

Есть какие-нибудь мысли о том, как лучше всего решить эту проблему?


person jlarks32    schedule 02.02.2021    source источник


Ответы (1)


У меня были похожие проблемы с неустойчивыми навигационными ссылками. Больше всего мне удавалось обрабатывать навигационные ссылки так, как будто они не должны помещаться в списки, и полагаться на флаг isActive для их запуска.

Вот хорошее руководство по использованию isActive:

https://www.hackingwithswift.com/articles/216/complete-guide-to-navigationview-in-swiftui.

Я подозреваю, что изменение ваших навигационных ссылок на кнопки, создание одной NavigationLink в вашем представлении и изменение вашего onTapGesture объекта состояния для игры и изменение Bool для isActive будут работать. Это странная парадигма, очень отличная от HTML-ссылок.

Ключ

var body: some View {
@State var emojiView = false
    NavigationLink(“”, destination: EmojiMemoryGameView(viewModel: game), isActive: self.$emojiView)

Если вы измените self.emojiView в своем onTapGesture и игровую переменную в одном и том же месте, он должен перейти к ссылке. Надеюсь, это имеет смысл.

person Nicholas Rees    schedule 02.02.2021