【问题标题】:In SwiftUI, iOS15, 2nd level NavigationLink, isActive is not working在 SwiftUI、iOS15、2 级 NavigationLink、isActive 中不起作用
【发布时间】:2021-12-15 09:35:21
【问题描述】:

在 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 中,这段代码运行良好。 如何解决?

【问题讨论】:

    标签: swiftui swiftui-navigationlink


    【解决方案1】:

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

    documentation 不清楚为什么这会起作用(实际上,它专门指多列导航),但它似乎解决了许多与NavigationLink 相关的问题。参见,例如: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")
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要添加.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")}
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-21
        • 2019-11-14
        • 2021-03-31
        • 2019-11-15
        • 2022-08-11
        相关资源
        最近更新 更多