NavigationLink onTapGesture和导航无法持续触发

时间:2019-11-25 21:45:50

标签: swiftui

在SwiftUI视图中,我通过创建一个VStack来实现一个垂直滚动列表,该VStack包含一个包含一些文本的NavigationView。我通过遍历popularFeedTypes对象来构建此对象,从而为popularFeedTypes对象中的每个项目创建了一个NavigationLink。如果用户单击NavigationLink,则该用户将被推送到名为FeedTypeView的新视图。您可以在下面看到代码。

VStack{
    NavigationView{
        List (self.popularFeedTypes.popularFeedTypes!, id: \.self) { feedType in
            NavigationLink(destination: FeedTypeView(feedType: feedType)) {
                Text(feedType.feedType)
            }.onTapGesture {
                print("TAPPED")
            }
        }
        .navigationBarTitle(Text("Discover"), displayMode: .inline)
    }
}

我遇到的问题是,如果我在NavigationLink上执行onTapGesture操作,则根据单击行的方式,我会在模拟器中遇到不同的行为。如果我单击文本或该行右侧的箭头(>),则会触发onTapGesture,但不会进行导航。如果单击文本和箭头之间的空格,则不会触发onTapGesture,但会发生导航。如果删除onTapGesture代码,则单击三个位置中的任何一个都会导致导航。所以我的问题是,即使存在onTapGesture动作也不应该进行导航吗?另外,无论您单击组成NavigationLink的行在哪里,onTapGesture操作都不应触发吗?

4 个答案:

答案 0 :(得分:0)

如果您要同时执行动作和导航,则可以执行以下操作:

VStack{
        NavigationView{
            List (self.popularFeedTypes.popularFeedTypes!, id: \.self) { feedType in
                NavigationLink(destination: FeedTypeView(feedType: feedType)) {
                    Text(feedType.feedType)
                }
                .simultaneousGesture(TapGesture().onEnded{
                    print("TAPPED")
                })
            }
            .navigationBarTitle(Text("Discover"), displayMode: .inline)
        }
    }

答案 1 :(得分:0)

如果要在触发导航链接之前执行某些操作,则可以使用tagselection初始化导航链接。

struct someViewName: View {
    
    @State var navigationLinkTriggerer: Bool? = nil
    @State var navigationLinkFeedType: FeedType
    
    var body: some View {
        VStack {
            NavigationLink(destination: FeedTypeView(feedType: navigationLinkFeedType),
                           tag: true,
                           selection: $navigationLinkTriggerer) {
                EmptyView()
            }
            
            NavigationView {
                List (self.popularFeedTypes.popularFeedTypes!, id: \.self) { feedType in
                    Button(feedType) {
                        // do all you want here
                        print("TAPPED")
                        // then set the navigationLinkTriggerer to value of you navigation link `tag`
                        // in this case tag is equal to `true`
                        // this will trigger the navigation link
                        self.navigationLinkFeedType = feedType
                        self.navigationLinkTriggerer = true
                    }
                }
                .navigationBarTitle(Text("Discover"), displayMode: .inline)
            }
        }
    }
}

答案 2 :(得分:0)

您可以使用onAppear处理点击事件。

VStack {
    NavigationView {
        List(self.popularFeedTypes.popularFeedTypes!, id: \.self) { feedType in
            NavigationLink(
                destination: FeedTypeView(feedType: feedType).onAppear { print("TAPPED") }) {
                Text(feedType.feedType)
            }
        }
        .navigationBarTitle(Text("Discover"), displayMode: .inline)
    }
}

答案 3 :(得分:-1)

await db.collection...

这应该有效。在VStack { NavigationView{ List (self.popularFeedTypes.popularFeedTypes!, id: \.self) { feedType in NavigationLink(destination: FeedTypeView(feedType: feedType)) { Text(feedType.feedType) } .simultaneousGesture(TapGesture().onEnded { print("TAPPED") } .buttonStyle(PlainButtonStyle()) } .navigationBarTitle(Text("Discover"), displayMode: .inline) } } 上使用simultaneousGesture