我的应用程序支持iOS 15.0,所以我不能使用NavigationPath
。因此,我添加了NavigationView
并使用NavigationLink
进行导航。以下是我的简单应用流程。
FirstView→SecondView→ThirdView→ForthView
我想从ForthView导航到SecondView。但是导航回不工作。下面是我的代码。
struct FirstView: View {
@State private var isActive: Bool = false
var body: some View {
VStack(spacing: 8) {
Label("Hello, world!", systemImage: "globe")
NavigationLink(destination: SecondView(), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Second")
}
}
}
.padding()
}
}
struct SecondView: View {
@State private var isActive: Bool = false
var body: some View {
VStack(spacing: 8) {
Text("Hello, World!")
NavigationLink(destination: ThirdView(shouldGoToSecond: $isActive), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Third")
}
}
}
.navigationTitle("Second")
}
}
struct ThirdView: View {
@Binding var shouldGoToSecond: Bool
@State private var isActive: Bool = false
var body: some View {
VStack {
Text("Hello, World!")
NavigationLink(destination: ForthView(shouldGoToSecond: $shouldGoToSecond), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Go to Forth")
}
}
}
.navigationTitle("Third")
}
}
struct ForthView: View {
@Binding var shouldGoToSecond: Bool
var body: some View {
VStack {
Text("Hello, World")
Button {
shouldGoToSecond = false
} label: {
Text("Go to Second")
}
}
}
}
我使用@State
变量来激活导航链接并通过@Binding
将其传递给下一个视图,但它不起作用。我遗漏了什么?
当你有多个导航时,你可以使用NavigationLink
的isDetailLink
属性来实现。
struct FirstView: View {
@State private var isActive: Bool = false
var body: some View {
NavigationView {
VStack(spacing: 8) {
Label("Hello, world!", systemImage: "globe")
NavigationLink(destination: SecondView1(), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Second")
}
}.isDetailLink(false) //<---
}
.padding()
}
}
}
struct SecondView: View {
@State private var isActive: Bool = false
var body: some View {
VStack(spacing: 8) {
Text("Hello, World!")
NavigationLink(destination: ThirdView(shouldGoToSecond: $isActive), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Third")
}
}
}
.navigationTitle("Second")
}
}
struct ThirdView: View {
@Binding var shouldGoToSecond: Bool
@State private var isActive: Bool = false
var body: some View {
VStack {
Text("Hello, World!")
NavigationLink(destination: ForthView(shouldGoToSecond: $shouldGoToSecond), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Go to Forth")
}
}
}
.navigationTitle("Third")
}
}
struct ForthView: View {
@Binding var shouldGoToSecond: Bool
var body: some View {
VStack {
Text("Hello, World")
Button {
shouldGoToSecond = false
} label: {
Text("Go to Second")
}
}
}
}
这里有几个步骤来处理全局导航(不需要发送标志或绑定)
1
创建全局类class Network: NSObject, ObservableObject {
@Published var moveToHome: Bool = false
}
2
要弹出根文件的位置,然后更改moveToHome国旗
让你像这样在视图类中分配这个类
@EnvironmentObject var network: Network
然后更改按钮上的标志或在获得API响应后
self.network.moveToHome = true
3
去你的home类,在解散到home之前调用onReceive方法,改变下一次的标志
.onReceive(self.network.$moveToHome) { moveToDashboard in
if moveToDashboard {
print("Move to dashboard: (moveToDashboard)")
self.presentation.wrappedValue.dismiss()
self.network.moveToHome = false
}
}
注意:假设你的Home类是Home或Dashboard名称,然后你的导航到View1, View2, View3, .....viewN当你想要呈现Root时改变类的标记比如我想要在最后一个视图之后弹出然后把这个标记放在视图上或者你想要在第三个视图之后插入根然后放上第三个视图3
self.network.moveToHome = true
之后,你有主根,在同一个类上调用onReceive。假设我想回到Home类,然后把onReceive在View1....平均增加一个类->家+(导航)就是这样!
希望这对你有帮助,如果你有任何疑问,请告诉我
你应该使用
@Environment(.presentationMode) var presentaionMode