导航到SwiftUI中的不同视图
在下面的示例代码中,我有两个选项卡,在主选项卡(选项卡A)中,首页上有两个“按钮”,允许用户使用navigationlinks导航到两个视图(视图1或视图2)。在视图1和视图2中的每个视图中都有进一步的导航链接,因此当您切换选项卡,然后返回选项卡时,“我的代码”(故意)会重置每个视图的导航堆栈。此外,如果导航到视图1或视图2(仍在主选项卡(选项卡A))上,则再次点击主选项卡按钮(选项卡A)将返回到首页(其中显示两个按钮)。这种行为正是我所需要的。我现在的问题是导航链接(到视图1和视图2)不能按预期工作。有时单击“查看1”按钮可查看2,有时可查看1。视图2按钮也会发生同样的情况。这一定与我如何重置导航堆栈以满足其他需要有关,但我不确定如何解决此问题。我提供了一些最基本的代码来说明这一点。有人知道如何解决这个问题吗?谢谢导航到SwiftUI中的不同视图,swiftui,navigationview,tabview,swiftui-navigationlink,Swiftui,Navigationview,Tabview,Swiftui Navigationlink,在下面的示例代码中,我有两个选项卡,在主选项卡(选项卡A)中,首页上有两个“按钮”,允许用户使用navigationlinks导航到两个视图(视图1或视图2)。在视图1和视图2中的每个视图中都有进一步的导航链接,因此当您切换选项卡,然后返回选项卡时,“我的代码”(故意)会重置每个视图的导航堆栈。此外,如果导航到视图1或视图2(仍在主选项卡(选项卡A))上,则再次点击主选项卡按钮(选项卡A)将返回到首页(其中显示两个按钮)。这种行为正是我所需要的。我现在的问题是导航链接(到视图1和视图2)不能按预
struct ContentView: View {
@State var activeView: Int = 0
@State var showNavigation: Bool = false
let items = ["View1", "View2"]
var body: some View {
TabView(selection: Binding<Int> (
get: {
activeView
}, set: {
activeView = $0
showNavigation = false
}))
{
NavigationView {
HStack {
VStack {
NavigationLink(
destination: View1(), isActive: $showNavigation, label: {
Rectangle()
.fill(Color.red)
.cornerRadius(12)
.frame(width: 70, height: 70)
}).isDetailLink(false)
Text(items[0])
}
VStack{
NavigationLink(
destination: View2(), isActive: $showNavigation, label: {
Rectangle()
.fill(Color.red)
.cornerRadius(12)
.frame(width: 70, height: 70)
}).isDetailLink(false)
Text(items[1])
}
}.navigationTitle("")
.navigationBarHidden(true)
}
.tabItem {
Image(systemName: "a.circle")
Text("Main")
}
.tag(0)
View3()
.padding()
.tabItem {
Image(systemName: "b.circle")
Text("View 3")
}
.tag(1)
}
}
struct ContentView:View{
@状态变量activeView:Int=0
@状态变量showNavigation:Bool=false
让项目=[“视图1”、“视图2”]
var body:一些观点{
选项卡视图(选择:绑定)(
获取:{
动态视图
},集:{
动态视图=$0
showNavigation=false
}))
{
导航视图{
HStack{
VStack{
导航链接(
目标:View1(),isActive:$showNavigation,标签:{
矩形()
.填充(颜色.红色)
.转弯半径(12)
.框架(宽度:70,高度:70)
}).isDetailLink(错误)
文本(项目[0])
}
VStack{
导航链接(
目标:View2(),isActive:$showNavigation,标签:{
矩形()
.填充(颜色.红色)
.转弯半径(12)
.框架(宽度:70,高度:70)
}).isDetailLink(错误)
案文(项目[1])
}
}.navigationTitle(“”)
.navigationBarHidden(真)
}
.tabItem{
图像(系统名称:“a.circle”)
正文(“主要”)
}
.tag(0)
视图3()
.padding()
.tabItem{
图像(系统名称:“b.circle”)
文本(“视图3”)
}
.标签(1)
}
}
}问题似乎在于,您对这两个
NavigationLink
使用了相同的showNavigation
变量
我已将变量更改了一点,以保留id
,并添加了自定义绑定
,以跟踪哪个导航链接
应处于活动状态:
struct ContentView: View {
@State var activeView: Int = 0
@State var activeNavigationLink: Int = 0 //<-- Here
let items = ["View1", "View2"]
func navigationLinkBinding(id: Int) -> Binding<Bool> { //<-- Here
.init { () -> Bool in
activeNavigationLink == id
} set: { (newValue) in
if newValue {
activeNavigationLink = id
} else {
activeNavigationLink = 0
}
}
}
var body: some View {
TabView(selection: Binding<Int> (
get: {
activeView
}, set: {
activeView = $0
activeNavigationLink = 0 //<-- Here
}))
{
NavigationView {
HStack {
VStack {
NavigationLink(
destination: Text("View 1"), isActive: navigationLinkBinding(id: 1), label: { //<-- Here
Rectangle()
.fill(Color.red)
.cornerRadius(12)
.frame(width: 70, height: 70)
}).isDetailLink(false)
Text(items[0])
}
VStack{
NavigationLink(
destination: Text("View 2"), isActive: navigationLinkBinding(id: 2), label: { //<-- Here
Rectangle()
.fill(Color.red)
.cornerRadius(12)
.frame(width: 70, height: 70)
}).isDetailLink(false)
Text(items[1])
}
}.navigationTitle("")
.navigationBarHidden(true)
}
.tabItem {
Image(systemName: "a.circle")
Text("Main")
}
.tag(0)
Text("View 3")
.padding()
.tabItem {
Image(systemName: "b.circle")
Text("View 3")
}
.tag(1)
}
}
}
结构ContentView:View{
@状态变量activeView:Int=0
@状态变量activeNavigationLink:Int=0//绑定{//Bool-in
activeNavigationLink==id
}集合:{(newValue)在
如果是新值{
activeNavigationLink=id
}否则{
activeNavigationLink=0
}
}
}
var body:一些观点{
选项卡视图(选择:绑定)(
获取:{
动态视图
},集:{
动态视图=$0
activeNavigationLink=0//非常感谢,问题解决了