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 等多列设备)。

posted @ 2026-04-13 09:33  cnchengv  阅读(17)  评论(0)    收藏  举报