swiftui - 为什么NavigationStack的navigationDestination作为VStack的一部分没有被调用?

标签 swiftui swiftui-navigationstack

NavigationStack 如果导航堆栈是另一个容器的子容器,则不会调用 .navigationDestination()

导航在视觉上发生,但它仅将中间带有典型黄色警告图标的 View 推送到堆栈。如果我将 NavigationStack 作为父 View ,那么它会调用 .navigationDestination() 并且一切都会按预期工作,只是它不满足 UI 要求。

iOS版本:16.2

为什么会这样以及如何解决?

我的代码的近似值。

var body: some View {
    VStack {
        MyCustomTopBarView()
        MyAlwaysOnScreenNavigationStepsProgressBar()
        NavigationStack($path) {
            contentView()
        }
        .navigationDestination(for: NavigationState.self) { navigationState in

            switch navigationState {
            case .screen1:
                Text("screen 1")
            }
        }
        .navigationBarHidden(true)
    }
}

enter image description here

最佳答案

您只需将 .navigationDestination 添加到 NavigationStack 中的顶级 View ,例如...

enum NavigationState {
    case screen1
}

struct ContentView: View {
    
    @State private var path = NavigationPath()
    
    var body: some View {
        VStack {
            MyCustomTopBarView()
            MyAlwaysOnScreenNavigationStepsProgressBar()
            NavigationStack(path: $path) {
                contentView()
                    .navigationDestination(for: NavigationState.self) { navigationState in

                        switch navigationState {
                        case .screen1:
                            Text("screen 1")
                        }
                    }
                    .navigationBarHidden(true)
            }
            Button("Show content") {
                path.append(NavigationState.screen1)
            }
        }
    }
    
    func contentView() -> some View {
        Text("Content")
    }
}

struct MyCustomTopBarView: View {
    var body: some View {
        Rectangle().fill(.red)
            .frame(height: 40)
    }
}

struct MyAlwaysOnScreenNavigationStepsProgressBar: View {
    var body: some View {
        ProgressView()
            .progressViewStyle(.linear)
    }
}

enter image description here

关于swiftui - 为什么NavigationStack的navigationDestination作为VStack的一部分没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75512392/

相关文章:

ios - 为什么清空 NavigationStack 路径后对象仍在内存中?

swiftui - SwiftUI 中新的 NavigationStack 过渡,如何从默认幻灯片更改为自定义或显示?

swiftui - 如何在 TabView 中使用新的 iOS 16 NavigationStack 进行 popToRoot?

ios - 更改图标会导致 SwiftUI 动画出现故障?

uikit - SwiftUI 通过实现 UIViewRepresentable 使用 UIKit 组件

swiftui - SwiftUI 中的选择器适用于一个版本的 ForEach,但不适用于另一个版本 - 错误或预期行为?

macos - 如何在状态栏应用程序中定位 NSPopover (macOS)

swift - 新的 iOS 开发者应该使用 Storyboard 和 Xibs/Nibs 吗?