Swiftui 使用NavigationView进行交叉导航

Swiftui 使用NavigationView进行交叉导航,swiftui,Swiftui,我有以下结构 enum Page { case chapter1 case chapter2 } struct ContentView: View { @State var page: Page? = nil var body: some View { NavigationView { VStack { NavigationLink(destination: Chapter1(page: s

我有以下结构

enum Page {
    case chapter1
    case chapter2
}

struct ContentView: View {
    @State var page: Page? = nil
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: Chapter1(page: self.$page),
                               tag: .chapter1,
                               selection: self.$page) {
                    Text("Chapter 1")
                }
                NavigationLink(destination: Chapter2(page: self.$page),
                               tag: .chapter2,
                               selection: self.$page) {
                    Text("Chapter 2")
                }
            }
        }
    }
}

struct Chapter1: View {
    @Binding var page: Page?
    var body: some View {
        VStack {
            Button("Back to Overview") {
                self.page = nil
            } 
            Button("Chapter 2") {
                self.page = .chapter2
            }
        }
    }
}

struct Chapter2: View {
    @Binding var page: Page?
    var body: some View {
        VStack {
            Button("Back to Overview") {
                self.page = nil
            }
        }
    }
}
当我从
第一章直接转到
第二章时,它中断了
第二章的反向链接

首先,原因是什么


其次,是否有一种方法可以使用不同类型的动画从
第1章
过渡到
第2章
,而不是重复前后翻转?

基于每个级别的
导航视图
管理器链接,因此修改其他堆栈级别可能会导致意外行为

下面是所描述用例的解决方案。使用Xcode 11.4/iOS 13.4进行测试

struct TestNavigationByEnum: View {
    @State var page: Page? = nil
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: Chapter1(page: self.$page),
                               tag: .chapter1,
                               selection: self.$page) {
                    Text("Chapter 1")
                }.isDetailLink(false) // important !!

                NavigationLink(destination: Chapter2(page: self.$page),
                               tag: .chapter2,
                               selection: self.$page) {
                    Text("Chapter 2")
                }.isDetailLink(false)
            }
        }
    }
}

struct Chapter1: View {
    @Binding var page: Page?
    var body: some View {
        VStack {
            Button("Back to Overview") {
                self.page = nil
            }
            // own level link
            NavigationLink(destination: Chapter2(page: self.$page)) {
                Text("Chapter 2")
            }.isDetailLink(false)
        }
    }
}