首页 > 解决方案 > NavigationLink + Text.onTapGesture 碰撞

问题描述

这个问题是,当单击 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's 的主体:

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。这是一个例子:

在此处输入图像描述

有关解决此问题的最佳方法的任何想法?

标签: swiftswiftuiswiftui-navigationlink

解决方案


我也遇到过类似的导航链接不稳定的问题。我将导航链接视为不应出现在列表中的东西并依靠 isActive 标志来触发它们,这是我取得了最大的成功。

这是一个关于如何使用 isActive 的好教程:

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

我怀疑将您的 navigationLinks 更改为按钮,在您的视图中创建一个 NavigationLink,并让您的 onTapGesture 更改游戏的状态对象并更改 isActive 的 Bool 将起作用。这是一个奇怪的范例,与 html 链接非常不同。

关键是

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

如果您更改 onTapGesture 中的 self.emojiView 和同一位置的游戏变量,它应该会将您导航到链接。希望这是有道理的。


推荐阅读