Swiftui NavigationLink OnTap手势和导航未一致触发

Swiftui NavigationLink OnTap手势和导航未一致触发,swiftui,Swiftui,在SwiftUI视图中,我通过创建一个VStack实现了一个垂直滚动列表,其中包含一个包含一些文本的NavigationView。我通过循环popularFeedTypes对象为popularFeedTypes对象中的每个项目创建导航链接来构建它。如果用户单击NavigationLink,则会将用户推送到名为FeedTypeView的新视图。您可以看到下面的代码 VStack{ NavigationView{ List (self.popularFeedTypes.pop

在SwiftUI视图中,我通过创建一个VStack实现了一个垂直滚动列表,其中包含一个包含一些文本的NavigationView。我通过循环popularFeedTypes对象为popularFeedTypes对象中的每个项目创建导航链接来构建它。如果用户单击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上有一个ontapsignature操作,我会在模拟器中体验到不同的行为,这取决于我单击行的方式。如果单击该行右侧的文本或箭头(>),OnTap手势将触发,但不会进行导航。如果单击文本和箭头之间的空格,则不会触发OnTap手势,但会进行导航。如果我删除了ontapsignature代码,单击这三个位置中的任何一个都会导致出现导航。所以我的问题是,即使存在一个ontapsignature操作,导航也不应该发生吗?另外,无论您在构成导航链接的行上单击什么位置,ONTAPPORATION操作都不应该触发吗?

如果您希望同时执行操作和导航,可以执行以下操作:

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)
        }
    }

这应该行得通。使用
导航链接上的
同时手势

如果您想在触发导航链接之前做些什么,可以使用
标记和
选择来初始化导航链接

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)
            }
        }
    }
}

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

VStack{
导航视图{
列表(self.popularFeedTypes.popularFeedTypes!,id:\.self){feedType in
导航链接(
目的地:FeedTypeView(feedType:feedType).onAppear{print(“TAPPED”)}){
文本(feedType.feedType)
}
}
.navigationBarTitle(文本(“发现”),显示模式:。内联)
}
}

NavigationLink本质上是一个按钮,因此它可以响应触摸,当您在其上添加一个点击按钮时,您会看到一个视图试图同时响应两个触摸。轻拍手势有什么用?也许可以用更好的方法实现?目的是根据用户的点击查询一些数据,并将其加载到环境对象为什么不在目的地的onApear()中启动它?我想这也行,我想在继续下一个视图之前需要做一些决定,但这可能可以用另一种方式来处理。不过我还是很好奇,在导航到另一个视图之前,是否有可能在单击过程中触发自定义逻辑。处理各种触摸是非常棘手的。您还可以在带有
isActive
标志的
EmptyView
上设置
按钮和
NavaigationLinink
。然后你可以在
按钮的动作中处理你想处理的任何事情,并将
isActive
设置为true作为最后一件事。不幸的是,这并没有解决我的问题,但这听起来像是在暗示这个解决方案如何为你工作?我试过了,但没用,谢谢!在最新的Swift/SwiftUI上对我来说非常有魅力。我用了一个懒散的习惯而不是列表,所以它可能是相关的。它不起作用。对我也不起作用!应该有用吗?你试过了吗?它不适合我,也不适合我@MatheusC–mara——这段代码对我很有用。
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)
            }
        }
    }
}