SwitUI-列表中的两个导航链接



我的List 的一个单元格中有两个NavigationLink

当我点击一次时,我想去目的地1,当我点击两次时,去目的地2。所以我添加了双击手势来控制导航。

但当我点击时,有两个问题:

  • 1敲击手势块不会被调用
  • 2两个导航链接都将自动激活,即使它们位于TextView后面。真正的效果是:点击单元格->转到目的地1->回到家->转到目的地2->回到家

这是我的代码:

struct MultiNavLink: View {
@State var mb_isActive1 = false;
@State var mb_isActive2 = false;

var body: some View {
return
NavigationView {
List {
ZStack {
NavigationLink("", destination: Text("Destination1"), isActive: $mb_isActive1)
NavigationLink("", destination: Text("Destination2"), isActive: $mb_isActive2)
Text("Single tap::go to destination1nDouble tap,go to destination2")
}
.onTapGesture(count: 2, perform: {()->Void in
NSLog("Double tap::to destination2")
self.mb_isActive2 = true
}).onTapGesture(count: 1, perform: {()->Void in
NSLog("Single tap::to destination1")
self.mb_isActive1 = true
})
}.navigationBarTitle("MultiNavLink",displayMode: .inline)
}
}
}

我已经尝试删除List元素,然后一切都如我所愿。似乎是List元素让一切变得奇怪。

我发现了这个问题:SwiftUI-列表中有两个按钮,但情况与我不同。

我期待着你的回答,非常感谢。。。

尝试以下方法-其想法是在可见内容的背景中隐藏链接,并使它们在UI中处于非活动状态,但通过编程方式激活。

使用Xcode 12/iOS 14进行测试。

struct MultiNavLink: View {
var body: some View {
return
NavigationView {
List {
OneRowView()
}.navigationBarTitle("MultiNavLink", displayMode: .inline)
}
}
}
struct OneRowView: View {
@State var mb_isActive1 = false
@State var mb_isActive2 = false
var body: some View {
ZStack {
Text("Single tap::go to destination1nDouble tap,go to destination2")
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.contentShape(Rectangle())
.background(Group {
NavigationLink(destination: Text("Destination1"), isActive: $mb_isActive1) {
EmptyView() }
.buttonStyle(PlainButtonStyle())
NavigationLink(destination: Text("Destination2"), isActive: $mb_isActive2) {
EmptyView() }
.buttonStyle(PlainButtonStyle())
}.disabled(true))
.highPriorityGesture(TapGesture(count: 2).onEnded {
self.mb_isActive2 = true
})
.onTapGesture(count: 1) {
self.mb_isActive1 = true
}
}
}

导航链接有一个初始值设定项,它接受绑定selection,每当selection设置为NavigationLinktag的值时,导航链接就会触发。作为提示,如果应用程序无法区分和识别你的敲击,即使有两次敲击,一次敲击的动作仍然会被触发,那么你可以使用同时手势(.simultaneousGesture()(修饰符而不是普通手势(.gesture()(修饰符。

struct someViewName: View {

@State var navigationLinkTriggererForTheFirstOne: Bool? = nil
@State var navigationLinkTriggererForTheSecondOne: Bool? = nil

var body: some View {
VStack {
NavigationLink(destination: SomeDestinationView(),
tag: true,
selection: $navigationLinkTriggererForTheFirstOne) {
EmptyView()
}

NavigationLink(destination: AnotherDestinationView(),
tag: true,
selection: $navigationLinkTriggererForTheSecondOne) {
EmptyView()
}

NavigationView {
Button("tap once to trigger the first navigation link.ntap twice to trigger the second navigation link.") {
// tap once
self.navigationLinkTriggererForTheFirstOne = true
}
.simultaneousGesture(
TapGesture(count: 2)
.onEnded { _ in
self.navigationLinkTriggererForTheSecondOne = true
}
)
}
}
}
}

最新更新