SwiftUI NavigationStack弹出到根



如何在IOS 16的新NavigationStack中弹出root,而在其他NavigationLink中使用许多NavigationLink?

这里是使用NavigationLink(_ title, value: )的解决方案,但是一旦我尝试在.navigationDestination内构建更多的NavigationLinkViews,NavigationStack给出错误A navigationDestination for MyApp.DataObject was declared earlier on the stack. Only the destination declared closest to the root view of the stack will be used.

struct DataObject: Identifiable, Hashable {
let id = UUID()
let name: String
}
@available(iOS 16.0, *)
struct ContentView8: View {
@State private var path = NavigationPath()

var body: some View {
NavigationStack(path: $path) {
Text("Root Pop")
.font(.largeTitle)
.foregroundColor(.primary)

NavigationLink("Click Item", value: DataObject.init(name: "Item"))

.listStyle(.plain)
.navigationDestination(for: DataObject.self) { course in
Text(course.name)
NavigationLink("Go Deeper", value: DataObject.init(name: "Item"))
Button("Back to root") {
path = NavigationPath()
}
}
}
.padding()
}
}

下面是尝试上述方法的错误示例。在NavigationLink中添加具有另一个NavigationLink的视图似乎会给出错误。

struct NavObj: Identifiable, Hashable {
let id = UUID()
let name: String
}
@available(iOS 16.0, *)
struct ContentView881: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack() {
NavigationLink(destination: T0121(test: 1), label: {Text("Click")})
}
}
}
@available(iOS 16.0, *)
struct T0121: View{
@State var test: Int
var body: some View{
VStack{
Text(String(test))
NavigationLink(value: NavObj.init(name: "Next"), label: {Text("Click")})
.navigationDestination(for: NavObj.self) { item in
T0121(test: 2)
}
}
}
}

由于我在其他视图中有许多视图,我认为我应该坚持使用NavigationLink(destination, label),但以下逻辑弹出到root,适用于NavigationView,不适用于NavigationStack:

@available(iOS 16.0, *)
struct ContentView: View {
@State private var isActive = false
var body: some View {
NavigationStack{
NavigationLink(destination: TestView(test: 1, isActive: $isActive), isActive: $isActive, label: {Text("Click")})
}
}
}
@available(iOS 16.0, *)
struct TestView: View{
@State var test: Int
@Binding var isActive: Bool
var body: some View{
VStack{
Text(String(test))
NavigationLink(destination: TestView(test: test+1, isActive: $isActive), label: {Text("Click")})
Button(action: {
isActive = false
}, label: {
Text("Root")
})
}
}
}
我很抱歉提出这么长的问题,我只是想用大量的例子把这个问题弄清楚。谢谢你的帮助!!

在iOS 16中处理pop-to-root的正确方法,使用NavigationStackpath,问题似乎是navigationDestination修饰符在您的示例中应用于NavigationLink本身,它应该应用于包含NavigationLink(例如List)的堆栈顶部的视图。

所以你可以修改第二个例子:

struct NavObj: Identifiable, Hashable {
let id = UUID()
let name: String
}
struct ContentView881: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack() {
VStack {
NavigationLink(destination: T0121(test: 1), label: {Text("Click")})
}
.navigationDestination(for: NavObj.self) { item in
T0121(test: 2)
}
}
}
}
struct T0121: View{
@State var test: Int
var body: some View{
VStack{
Text(String(test))
NavigationLink(value: NavObj.init(name: "Next"), label: {Text("Click")})
}
}
}

最新更新