在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操作都不应触发吗?
答案 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)
如果要在触发导航链接之前执行某些操作,则可以使用tag
和selection
初始化导航链接。
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