SwiftUI - 列表中的两个导航链接
SwitUI - Two navigationLink in a list
我的列表的一个单元格中有两个 NavigationLink
我想点击一次去目的地1,点击两次去目的地2。
所以我添加了两个点击手势来控制导航。
但是点击的时候有两个问题:
- 1 点按手势块不会被调用。
- 2 两个导航 link 即使在 TextView 后面也会自动激活。
实际效果是:点击cell -> 去Destination1 -> 回到home -> 去Destination2 -> 回到home
这是我的代码:
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 destination1\nDouble 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元素让一切变得奇怪
我发现了这个问题:,但是情况和我不一样
期待您的回答,非常感谢...
导航 link 有一个接受绑定 selection
的初始化程序,只要 selection
设置为 NavigationLink tag
的值,导航 link 将触发。
作为提示,如果应用程序无法区分和识别您的点击,即使点击两次,仍然会触发 one-tap 的动作,那么您可以使用同步手势(.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
}
)
}
}
}
}
尝试以下方法 - 这个想法是在可见内容的背景中隐藏链接并使它们在 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 destination1\nDouble 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
}
}
}
我的列表的一个单元格中有两个 NavigationLink
我想点击一次去目的地1,点击两次去目的地2。 所以我添加了两个点击手势来控制导航。
但是点击的时候有两个问题:
- 1 点按手势块不会被调用。
- 2 两个导航 link 即使在 TextView 后面也会自动激活。 实际效果是:点击cell -> 去Destination1 -> 回到home -> 去Destination2 -> 回到home
这是我的代码:
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 destination1\nDouble 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元素让一切变得奇怪
我发现了这个问题:
期待您的回答,非常感谢...
导航 link 有一个接受绑定 selection
的初始化程序,只要 selection
设置为 NavigationLink tag
的值,导航 link 将触发。
作为提示,如果应用程序无法区分和识别您的点击,即使点击两次,仍然会触发 one-tap 的动作,那么您可以使用同步手势(.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
}
)
}
}
}
}
尝试以下方法 - 这个想法是在可见内容的背景中隐藏链接并使它们在 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 destination1\nDouble 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
}
}
}