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