如何在IOS 16的新NavigationStack
中弹出root
,而在其他NavigationLink
中使用许多NavigationLink
?
这里是使用NavigationLink(_ title, value: )
的解决方案,但是一旦我尝试在.navigationDestination
内构建更多的NavigationLink
Views
,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的正确方法,是使用NavigationStack
与path
,问题似乎是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")})
}
}
}