oc-sw
// // ContentView.swift // test260412 // // Created by wang on 2026/4/12. // import SwiftUI struct ContentView: View { @StateObject private var viewModel = FileBrowserViewModel() @State private var isSidebarVisible = true var body: some View { NavigationView { // 左侧文件浏览器 FileBrowserView(viewModel: viewModel) .frame(minWidth: 250, idealWidth: 280, maxWidth: 350) .navigationTitle("文件浏览器") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarLeading) { Button(action: { withAnimation(.easeInOut(duration: 0.25)) { isSidebarVisible.toggle() } }) { Image(systemName: "sidebar.left") .font(.system(size: 16)) } } } // 右侧代码编辑器 CodeEditorView(viewModel: viewModel) .navigationTitle(viewModel.selectedFile?.lastPathComponent ?? "代码编辑器") .navigationBarTitleDisplayMode(.inline) } .navigationViewStyle(DoubleColumnNavigationViewStyle()) } } /* import SwiftUI struct ContentView: View { @StateObject private var viewModel = FileBrowserViewModel() // 1. 定义导航路径 // 我们将使用文件路径(String)作为导航的唯一标识 @State private var path = NavigationPath() var body: some View { // 2. 使用 NavigationStack 包裹 NavigationStack(path: $path) { FileBrowserView(viewModel: viewModel) .navigationTitle("文件浏览器") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarLeading) { // 3. iPhone 通常不需要“显示/隐藏侧边栏”按钮 // 因为手机是单列的,这里可以改为“返回”或“菜单”按钮 // 如果你仍想保留折叠逻辑(例如配合 iPad 通用代码),保留也可以 Button("菜单") { // 在 iPhone 上,这通常用于打开一个抽屉菜单或模态视图 // 如果只是单纯为了导航,这个按钮在 Stack 中不是必须的 } .buttonStyle(.bordered) } } // 4. 关键:当用户在 FileBrowserView 中选择一个文件时,触发跳转 // 我们需要监听 viewModel 的变化,自动将文件推入导航栈 .onChange(of: viewModel.selectedFile) { newFile in if let newFile = newFile { // 将文件路径(或文件名)推入栈,触发右侧视图显示 path.append(newFile.lastPathComponent) } else { // 如果没有文件被选中,清空栈(回到列表) path.removeLast(path.count) } } // 注意:在 NavigationStack 中,Detail 视图不再直接写在这里 // 而是通过 navigationDestination 定义 } // 5. 定义目的地 // 当栈中有 String 类型的值时,显示 CodeEditorView .navigationDestination(for: String.self) { fileName in // 这里我们假设通过文件名能找到对应的文件 // 或者你可以传递文件 ID CodeEditorView(viewModel: viewModel) .navigationTitle(viewModel.selectedFile?.lastPathComponent ?? "代码编辑器") .navigationBarTitleDisplayMode(.inline) } } } */
to thi,找到原因了
在 SwiftUI 开发中,NavigationView 曾是构建导航界面的核心容器,但自 iOS 16 起,它已被弃用。苹果将其功能细分为两个更专业的组件:NavigationStack(用于 iPhone 等紧凑设备)和 NavigationSplitView(用于 iPad 等多列设备)。
浙公网安备 33010602011771号