在SwiftUI中使用NavigationStack呈现表视图

5

我正在尝试找出在iOS 16中使用新的NavigationStack打开表格的方法,但似乎找不到方法。

当然,可以使用以下方式打开表格:

.sheet(isPresented: $isShowing)

但是使用新的NavigationStack,您将获得一个类型的数组,您可以使用以下方式进行呈现:
.navigationDestination(for: SomeType.self, destination: { route in

如果我能定义特定目标以表格形式而不是模态导航呈现,那就太棒了。

有人知道这是否可能实现吗?:)

3个回答

1

我仍然没有找到一个只使用navigationDestination的干净解决方案,但是我最终实现了类似这样的东西,这使得它成为可能。

我想现在把它发布为答案,因为有人可能能够进一步改进它或使其更通用。

enum Route: Hashable, Identifiable {
    var id: Self { return self }
    case details(RouteType)
    case shopping(RouteType)
}

enum RouteType {
    case modal
    case sheet
}

struct ContentView: View {
    @State private var path = NavigationPath()
    @State private var route: Route?
    @State private var sheet: Route?

    func router(_ route: Route, type: RouteType) {
        switch type {
        case .modal:
            path.append(route)
        case .sheet:
            sheet = route
        }
    }

    func getView(for route: Route) -> some View {
        switch route {
        case .details(_):
            return Text("Details View")
        case .shopping(_):
            return Text("Shopping View")
        }
    }

    var body: some View {
        NavigationStack(path: $path) {
            VStack {
                Text("Content View")
                Button("Show View") {
                    route = Route.details(.sheet) // <- Change accordingly
                }
            }
            .navigationTitle("Content View")
            .onChange(of: route) { newRoute in
                guard let newRoute else { return }
                switch newRoute {
                case .details(let type):
                    router(newRoute, type: type)
                case .shopping(let type):
                    router(newRoute, type: type)
                }
                route = nil
            }
            .navigationDestination(for: Route.self) { route in
                getView(for: route)
            }
            .sheet(item: $sheet) { route in
                getView(for: route)
            }
        }
    }
}

0

这对我很有用。我可以从任何视图将对象推送到我的路由,并使用模态表单加载它。

class Route: ObservableObject {
    
    @Published var presentedObject: [CarObject] = []
    @Published var isPresented: Bool = false

}

struct NavigationWithSheet: View {
    var body: some View {
        
        @EnvironmentObject var route: Route
        
        NavigationStack {
            Button("Open sheet") {
                route.isPresented = true
                route.presentedObject.append(newCar)
            }
            .sheet(isPresented: $route.isPresented) {
                let carObject = route.presentedObject.first
                ViewWithObject(car: carObject!)
            }
        }
        
    }
}


目前你的回答不够清晰,请[编辑]以添加更多细节,帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

谢谢您的回复。但是这与.navigationDestination(for: SomeType.self, destination: { route in相同,这不是我要求的:) 我想要打开一个sheet视图的目标。 - bjorn.lau
抱歉,我误解了。我以为问题是关于将它链接到布尔值,仔细阅读后我发现你非常清楚地想要它作为“Sheet”表格。很棒的问题。 - carlynorama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接