在 SwiftUI、iOS15、第二级 NavigationLink 中,isActive 不起作用

蘇哲聖*_*蘇哲聖 5 swiftui swiftui-navigationlink

在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")}
    }
}
Run Code Online (Sandbox Code Playgroud)

dismiss里面的按钮不起作用Dest2!我记得在iOS14中,这段代码运行得很好。如何解决这个问题?

jn_*_*pdx 7

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

文档并不清楚为什么它起作用事实上,它特指多列导航),但它似乎解决了许多相关问题。例如,请参阅:https ://developer.apple.com/forums/thread/667460NavigationLink

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")
    }
}
Run Code Online (Sandbox Code Playgroud)


wor*_*dog 6

您需要添加.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")}
    }
}
Run Code Online (Sandbox Code Playgroud)