【问题标题】:SwiftUI TabView and NavigationView Mixed - Pop To Root doesn't workSwiftUI TabView 和 NavigationView 混合 - Pop To Root 不起作用
【发布时间】:2021-04-26 04:39:25
【问题描述】:

似乎很明显,当我同时使用 TabView 和 NavigationView 时 - Pop To Root 不起作用。 这是我实现的两个测试代码。一种同时具有 tabView 和 NavigationView,一种仅具有 Navigation View。

  1. 包含 TabView 和 NavigationView 的代码
import SwiftUI

class Views: ObservableObject {
  @Published var stacked = false
}

struct ContentView: View {
  @ObservedObject var views = Views()
  @State var selection: Int = 0

  var body: some View {
    NavigationView {
      TabView(selection: $selection) {
        ContentView2()
      }
    }
    .environmentObject(views)
  }
}

struct ContentView2: View {
  @EnvironmentObject var views: Views
  var body: some View {
    NavigationLink(destination: ContentView3(), isActive: $views.stacked) {
      Text("Go to View 2")
    }
    .isDetailLink(false)
  }
}

struct ContentView3: View {
  @EnvironmentObject var views: Views

  var body: some View {
    VStack {
      Button("Pop to root") {
        self.views.stacked = false
      }
    }
    .navigationBarTitle("View 3")
  }
}

  1. 仅代码导航视图
  • 只需从代码中删除 TabView 括号,它就可以像魅力一样工作......

当我尝试在 tabview 中弹出到 root 时,会显示一个日志 Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-120/Shared/NavigationBridge_PhoneTV.swift:341

有没有人找到办法顶 TabView 和 NavigationView,并实现 pop To Root?

【问题讨论】:

    标签: ios swift navigation combine


    【解决方案1】:

    试试这个:

    import SwiftUI
    
    
    struct ContentView: View {
        @State var isActive : Bool = false
    
        var body: some View {
            NavigationView {
                NavigationLink(
                    destination: ContentView2(rootIsActive: self.$isActive),
                    isActive: self.$isActive
                ) {
                    Text("Hello, World!")
                }
                .isDetailLink(false)
                .navigationBarTitle("Root")
            }
        }
    }
    
    struct ContentView2: View {
        @Binding var rootIsActive : Bool
    
        var body: some View {
            NavigationLink(destination: ContentView3(rootIsActive: self.$rootIsActive)) {
                Text("Hello, World #2!")
            }
            .isDetailLink(false)
            .navigationBarTitle("Two")
        }
    }
    
    struct ContentView3: View {
        @Binding var rootIsActive : Bool
    
        var body: some View {
            NavigationLink(destination: ContentView4(shouldPopToRootView: self.$rootIsActive)) {
                Text("Hello, World #3!")
            }
            .isDetailLink(false)
            .navigationBarTitle("Three")
        }
    }
    
    struct ContentView4: View {
        @Binding var shouldPopToRootView : Bool
    
        var body: some View {
            VStack {
                Text("Hello, World #4!")
                Button (action: { self.shouldPopToRootView = false } ){
                    Text("Pop to root")
                }
            }.navigationBarTitle("Four")
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多