在 SwiftUI 中,iOS15,二级 NavigationLink,isActive 不工作

In SwiftUI, iOS15, 2nd level NavigationLink, isActive is not working

在 iOS15 中,它不起作用:

import SwiftUI
struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink {
                Dest1().navigationTitle("Dest1")
            } label: {
                Text("to Destination 1")
            }
        }
    }
}

struct Dest1: View {
    @State var dest2Active: Bool = false
    var body: some View {
        NavigationLink(
            destination: Button {
                dest2Active = false // not working!!
            } label: {Text("dismiss")} .navigationTitle("Dest2"),
            isActive: $dest2Active
        ) {Text("to Destination 2")}
    }
}

Dest2 中的 dismiss 按钮无法使用! 我记得在 iOS14 中,这段代码运行良好。 如何解决?

.isDetailLink(false) 添加到顶层 NavigationLink 似乎可以解决问题。请注意,这适用于 iPhone iOS——对于 iPad,您将需要使用 StackNavigationStyle,正如@workingdog 在他们的回答中所建议的那样。

documentation is not clear on why this works (in fact, it refers specifically to multi-column navigation), but it seems to solve a number of NavigationLink-related issues. See, for example: https://developer.apple.com/forums/thread/667460

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink {
                Dest1()
                    .navigationTitle("Dest1")
            } label: {
                Text("to Destination 1")
            }.isDetailLink(false)
        }
    }
}

struct Dest1: View {
    @State var dest2Active: Bool = false
    var body: some View {
        NavigationLink(isActive: $dest2Active) {
            Dest2(dest2Active: $dest2Active)
        } label: {
            Text("to Destination 2")
        }
    }
}

struct Dest2: View {
    @Binding var dest2Active : Bool
    
    var body: some View {
        Button {
            dest2Active = false
        } label: {
            Text("Dismiss")
        }.navigationTitle("Dest2")
    }
}

您需要添加 .navigationViewStyle(.stack) 才能使其正常工作。 这是适合我的测试代码。

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink {
                Dest1().navigationTitle("Dest1")
            } label: {
                Text("to Destination 1")
            }
        }.navigationViewStyle(.stack) // <-- here the important bit
    }
}

struct Dest1: View {
    @State var dest2Active: Bool = false
    var body: some View {
        NavigationLink(
            destination: Button {
                dest2Active = false // now working!!
            } label: {Text("dismiss")} .navigationTitle("Dest2"),
            isActive: $dest2Active
        ) {Text("to Destination 2")}
    }
}