NavigationSplitView 内的 SwiftUI NavigationStack 无法在 iPhone 和 iPad 上运行

gre*_*rey 4 ios swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack

我正在尝试使用NavigationStack内部NavigationSplitView

struct ContentView: View {
    @State var mainMenu: MenuItem?
    @State var subMenu: SubMenuItem?
    
    var body: some View {
        NavigationSplitView {
            List(MenuItem.allCases, selection: $mainMenu) { item in
                NavigationLink(value: item) {
                    Text(item.rawValue)
                }
            }
        } detail: {
            NavigationStack {
                List(SubMenuItem.allCases, selection: $subMenu) { item in
                    NavigationLink(value: item) {
                        Text(item.rawValue)
                    }
                }
                .navigationDestination(for: SubMenuItem.self) { selected in
                    DetailView(item: selected)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct DetailView: View {
    let item: SubMenuItem
    
    var body: some View {
        Text(item.id)
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Mac 上,我能够很好地导航到DetailView

在此输入图像描述

但在 iPhone 和 iPad 上,我无法导航到DetailView. 我被困在SubMenu

在此输入图像描述

在此输入图像描述

这是一个已知的错误?或者我的代码有问题吗?

PS我发现这个问题几乎与this类似,但我没有使用多重/嵌套.navigationDestination,我的问题发生在iPhone/iPad上,而不是Mac上。

gre*_*rey 7

终于想通了。我使用了NavigationStackwith ,并为每个更改path手动设置了。现在该代码可以在每个平台上运行。pathsubMenu

struct ContentView: View {
    @State var mainMenu: MenuItem?
    @State var subMenu: SubMenuItem?
    @State var path: [SubMenuItem] = []
    
    var body: some View {
        NavigationSplitView {
            List(MenuItem.allCases, selection: $mainMenu) { item in
                NavigationLink(value: item) {
                    Text(item.rawValue)
                }
            }
            .onChange(of: mainMenu) { _ in
                // Reset subMenu selection (optional)
                subMenu = nil
            }
        } detail: {
            NavigationStack(path: $path) {
                List(SubMenuItem.allCases, selection: $subMenu) { item in
                    NavigationLink(value: item) {
                        Text(item.rawValue)
                    }
                }
                .navigationDestination(for: SubMenuItem.self) { selected in
                    DetailView(item: selected)
                }
                .onChange(of: subMenu) { sm in
                    // Manually set the path
                    if let sm {
                        path = [sm]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 然而,当我在 NavigationSplitView 中嵌入 NavigationStack 时,这是有效的,我在控制台中收到以下消息“更新 NavigationRequestObserver 尝试每帧更新多次。”顺便说一句,这是在 Xcode 14.2 上。 (3认同)