最后,现在有了Beta 5,我们可以以编程方式弹出到父视图。但是,在我的应用程序中,有几个地方视图都有一个“保存”按钮,该按钮可以结束几个步骤并返回到开始。在UIKit中,我使用popToRootViewController(),但是我一直无法找到在SwiftUI中执行相同操作的方法。
以下是我尝试实现的模式的简单示例。有任何想法吗?
import SwiftUI struct DetailViewB: View { @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> var body: some View { VStack { Text("This is Detail View B.") Button(action: { self.presentationMode.value.dismiss() } ) { Text("Pop to Detail View A.") } Button(action: { /* How to do equivalent to popToRootViewController() here?? */ } ) { Text("Pop two levels to Master View.") } } } } struct DetailViewA: View { @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> var body: some View { VStack { Text("This is Detail View A.") NavigationLink(destination: DetailViewB() ) { Text("Push to Detail View B.") } Button(action: { self.presentationMode.value.dismiss() } ) { Text("Pop one level to Master.") } } } } struct MasterView: View { var body: some View { VStack { Text("This is Master View.") NavigationLink(destination: DetailViewA() ) { Text("Push to Detail View A.") } } } } struct ContentView: View { var body: some View { NavigationView { MasterView() } } }
设置视图调节isDetailLink到false一个NavigationLink关键是让弹出到根的工作。isDetailLink是true默认设置,并且适用于包含的View。例如,在iPad横向上,分割视图是分开的,并isDetailLink确保目标视图将显示在右侧。因此,设置isDetailLink为false意味着目标视图将始终被推送到导航堆栈上。因此总是可以弹出。
isDetailLink
false
NavigationLink
true
连同设置isDetailLink为falseon NavigationLink,将isActive绑定传递到每个后续的目标视图。最后,当您要弹出到根视图时,将该值设置为false,它将自动弹出所有内容:
isActive
import SwiftUI struct ContentView: View { @State var isActive : Bool = false var body: some View { NavigationView { NavigationLink( destination: ContentView2(rootIsActive: self.$isActive), isActive: self.$isActive ) { Text("Hello, World!") } .isDetailLink(false) .navigationBarTitle("Root") } } } struct ContentView2: View { @Binding var rootIsActive : Bool var body: some View { NavigationLink(destination: ContentView3(shouldPopToRootView: self.$rootIsActive)) { Text("Hello, World #2!") } .isDetailLink(false) .navigationBarTitle("Two") } } struct ContentView3: View { @Binding var shouldPopToRootView : Bool var body: some View { VStack { Text("Hello, World #3!") Button (action: { self.shouldPopToRootView = false } ){ Text("Pop to root") } }.navigationBarTitle("Three") } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }