现在终于有了 Beta 5,我们可以通过编程方式弹出父 View 。但是,在我的应用程序中有几个地方的 View 有一个“保存”按钮,该按钮可以结束几个步骤的过程并返回到开头。在 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()
}
}
}
最佳答案
在 NavigationLink
上将 View 修饰符 isDetailLink
设置为 false
是使 pop-to-root 正常工作的关键。 isDetailLink
默认为 true
并且自适应包含的 View。例如,在 iPad landscape 上, Split View是分开的,isDetailLink
确保目标 View 将显示在右侧。因此,将 isDetailLink
设置为 false
意味着目标 View 将始终被推送到导航堆栈;因此可以随时弹出。
在 NavigationLink
上将 isDetailLink
设置为 false
的同时,将 isActive
绑定(bind)传递给每个后续目标 View 。最后,当你想弹出到 Root View 时,将值设置为 false
它会自动弹出所有内容:
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()
}
}
关于swift - 如何使用 SwiftUI 弹出到 Root View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57334455/