方案1 - 自定义EnvironmentKey
一种可能的解决方案是使用一个自定义的EnvironmentKey
来注入到每个环境中:
struct PresentationKey: EnvironmentKey {
static let defaultValue: [Binding<Bool>] = []
}
extension EnvironmentValues {
var presentations: [Binding<Bool>] {
get { return self[PresentationKey] }
set { self[PresentationKey] = newValue }
}
}
示例:
struct ContentView: View {
@Environment(\.presentations) private var presentations
@State private var showSheet = false
var body: some View {
Button("Show sheet") {
showSheet = true
}
.sheet(isPresented: $showSheet) {
SheetView()
.environment(\.presentations, presentations + [$showSheet])
}
}
}
struct SheetView: View {
@Environment(\.presentations) private var presentations
@State private var showSheet = false
var body: some View {
Button("Show another sheet") {
showSheet = true
}
.sheet(isPresented: $showSheet) {
SheetNavigationView()
.environment(\.presentations, presentations + [$showSheet])
}
}
}
struct SheetNavigationView: View {
var body: some View {
NavigationView {
NavigationLink("Link", destination: SheetNavigationDetailView())
}
}
}
struct SheetNavigationDetailView: View {
@Environment(\.presentations) private var presentations
var body: some View {
Button("Pop to root") {
presentations.forEach {
$0.wrappedValue = false
}
}
}
}
解决方案2 - 解除UIKit根视图控制器
struct SheetNavigationDetailView: View {
var body: some View {
Button("Pop to root") {
UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
}
}
}
self.view.window!.rootViewController?.dismiss(animated: false, completion: nil)
将会取消所有在根视图控制器上方的视图控制器。 - fulvio