在SwiftUI中使用NavigationStack显示图纸视图



我正试图弄清楚是否有办法在iOS 16中使用新的NavigationStack打开工作表,但似乎找不到方法。

因此,当然,可以使用打开纸张

.sheet(isPresented: $isShowing)

但有了新的NavigationStack,你就有了一个类型的数组,你可以用它来呈现:

.navigationDestination(for: SomeType.self, destination: { route in

如果我能以某种方式定义,当一个特定的目的地出现时,它会以一张纸的形式打开,而不是用模态导航,那就太棒了。

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

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

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!)
}
}

}
}

我仍然没有找到一个干净的解决方案,只使用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)
}
}
}
}

最新更新