swift - 如何使用 SwiftUI 弹出到 Root View ?

标签 swift swiftui

现在终于有了 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()
    }
}

Screen capture

关于swift - 如何使用 SwiftUI 弹出到 Root View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57334455/

相关文章:

objective-c - 在 Swift 项目中将 AFNetworking 与 Pod 结合使用时出现桥接问题

swift - 在 Xcode 中导入 Swift 框架 - 在哪里放置 "import"指令?

iOS UITextField addTarget 和 textFieldDidEndEditing 之间的区别

swiftui - 如何使用 SwiftUI 禁用整个应用程序或仅 View 上的多点触控?

swift - 如何阻止 swiftui 在 HStack 中将内容移出屏幕?

没有 NavigationLink 的 SwiftUI 列表披露指示器

ios - Swift - 将背景图像添加到 Spritekit 场景

ios - swift 如何知道要导入哪些文件?

swiftui - 如何在 SwiftUI 中交换 TabView 项目?

ios - Swift Array .append() 方法在 SwiftUI 中不起作用