SwiftUI:如何使用 NavigationViews 切换到新的导航堆栈

2024-02-06

我目前正在使用 SwiftUI Beta 5。我有一个工作流程,其中涉及浏览一系列视图。最后一个视图涉及将大量数据填充到应用程序中并结束特定工作流程的操作。

下载数据后,用户应该能够启动新的工作流程。我想“忘记”旧的 NavigationView,因为一旦工作流程完成,返回导航堆栈是没有用的。相反,我想导航到“启动”视图,该视图实际上成为新导航视图的根。

如何使用 SwiftUI NavigationView 使用导航堆栈中的一个视图导航到具有不同 NavigationView 的另一个视图(并因此成为新导航堆栈的根)?


首先,抱歉我想发表一个简单的评论但没有足够的声誉点:(

我刚刚更新了回到你的根的方式stackoverflow.com/a/57513566/7786555 https://stackoverflow.com/questions/57334455/swiftui-how-to-pop-to-root-view/57513566#57513566

实际上,您的评论给了我一个想法,即寻找回到根源的新方法。拥有新的根视图。如果您强制刷新管理根视图的结构视图,那么它将自动执行您想要的操作。这里只是回到根(没有动画)。您可以调整示例来更改根视图(而不是使用相同的根视图)以满足您的需要。

struct DetailViewB: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    @State var fullDissmiss:Bool = false
    var body: some View {
        SGNavigationChildsView(fullDissmiss: self.fullDissmiss){
            VStack {
                Text("This is Detail View B.")

                Button(action: { self.presentationMode.wrappedValue.dismiss() } )
                { Text("Pop to Detail View A.") }

                Button(action: {
                    self.fullDissmiss = true
                } )
                { Text("Pop two levels to Master View with SGGoToRoot.") }
            }
        }
    }
}

struct DetailViewA: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    @State var fullDissmiss:Bool = false
    var body: some View {
        SGNavigationChildsView(fullDissmiss: self.fullDissmiss){
            VStack {
                Text("This is Detail View A.")

                NavigationLink(destination: DetailViewB() )
                { Text("Push to Detail View B.") }

                Button(action: { self.presentationMode.wrappedValue.dismiss() } )
                { Text("Pop one level to Master.") }

                Button(action: { self.fullDissmiss = true } )
                { Text("Pop one level to Master with SGGoToRoot.") }
            }
        }
    }
}

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 {
        SGRootNavigationView{
            MasterView()
        }
    }
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

struct SGRootNavigationView<Content>: View where Content: View {
    let cancellable = NotificationCenter.default.publisher(for: Notification.Name("SGGoToRoot"), object: nil)

    let content: () -> Content

    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content
    }

    @State var goToRoot:Bool = false

    var body: some View {
        return
            Group{
            if goToRoot == false{
                NavigationView {
                content()
                }
            }else{
                NavigationView {
                content()
                }
            }
            }.onReceive(cancellable, perform: {_ in
                DispatchQueue.main.async {
                    self.goToRoot.toggle()
                }
            })
    }
}

struct SGNavigationChildsView<Content>: View where Content: View {
    let notification = Notification(name: Notification.Name("SGGoToRoot"))

    var fullDissmiss:Bool{
        get{ return false }
        set{ if newValue {self.goToRoot()} }
    }

    let content: () -> Content

    init(fullDissmiss:Bool, @ViewBuilder content: @escaping () -> Content) {
        self.content = content
        self.fullDissmiss = fullDissmiss
    }

    var body: some View {
        return Group{
            content()
        }
    }

    func goToRoot(){
        NotificationCenter.default.post(self.notification)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI:如何使用 NavigationViews 切换到新的导航堆栈 的相关文章

随机推荐

  • Pandas 对条形图进行分组和重采样:

    我有一个数据框 以高时间频率 为了计算平均浓度 我必须对每日和每月数据应用质量控制过滤器 我的方法是首先应用过滤器并每年重新采样 然后按位置和年份进行分组 另外 在所有位置 在标题为 位置 的列中 中 我只需选择几行 因此 我对原始数据框进
  • SMIL(同步多媒体集成语言)的未来?

    SMIL 同步多媒体集成语言 最后一次更新是在2008年 有谁知道在同步多媒体文件时是否有更好的协议可以遵循 SMIL 没有天然的竞争对手 因此任何其他解决方案都将依赖于脚本 它支持 ePub 阅读器 例如Azardi http azard
  • 为什么删除不是 Subversion 的基本功能?

    几年来 我一直在等待 Subversion 提供 永久删除 消除 功能 我犹豫是否要过渡到 Subversion 来自 Visual SourceSafe p 因为我认为这是一个基本功能 否则我会期望存储库会不可阻挡地增长 然而 由于某种原
  • 阻塞读和非阻塞读有什么区别?

    在上述问题中添加等待 不等待指示器的概念作为 TCP IP 或 UDP 环境中 ReadMessage 函数的参数 第三方功能描述指出 此函数用于从先前的 registerforinput 调用定义的队列中读取消息 输入等待 不等待指示器将
  • Pandas - 计算相对于最早值的每日差异

    这可能很容易 但由于某种原因 我发现它很难完成 任何提示将非常感谢 我有一些每天 5 分钟间隔的时间序列数据 唉 Date Values 2012 12 05 09 30 00 5 2012 12 05 09 35 00 7 2012 12
  • 在同一行文本上对齐不同的字体大小以便看起来不错?

    基本上 我希望在同一行上有一个 h1 和一个 p 元素 但是对齐方式偏离了很多 意味着 H1 高于 P 并且看起来很糟糕 并且我之前从未使用 css 做过这样的事情 我已经整理了一个 jsfiddle 来配合它 这里是代码 h1 style
  • ASP.NET MVC3 Razor - 如何有条件地退出或结束或返回或中断部分视图?

    使用 Razor 如何有条件地退出或结束或返回或中断部分视图 if Model null return 不 你不return在视图中 您只需不在主视图中包含此类部分即可 if Model null Html Partial somePart
  • Python CFFI 的内存管理和析构函数/free() 约定?

    如果我包装一个 C 类 from ffi import ffi lib class MyClass object def init self self c class lib MyClass create 确保的最佳实践是什么lib MyC
  • 我可以获得 HTMLElement DOM 对象的完整 HTML 表示形式吗?

    我正在使用 jquery 来解析一些 HTML 例如 html contents each function var element this tagName 我可以使用 DOM 或更友好的 jQuery 函数访问 tagName 子项 父
  • 迭代数组的每个元素(第一个元素除外)

    编写此代码的惯用 Ruby 方式是什么 给定一个数组 我想迭代该数组的每个元素 但跳过第一个元素 我想在不分配新数组的情况下执行此操作 这是我想出的两种方法 但都不是特别优雅 这可行 但似乎太冗长了 arr each with index
  • SQL Server 连接后行数低估

    当实际行数为 2000 时 查询优化器估计联接结果只有一行 这导致数据集上的后续联接的估计结果只有一行 而其中一些联接的结果却高达 2000 30 000 计数为 1 时 QO 正在为许多连接选择循环连接 索引查找策略 这太慢了 我通过限制
  • 配置Webpack将LESS文件的目录构建成相应的CSS文件

    我希望使用 Webpack 编译我们所有的 less 文件 less to public css并将它们作为常规 css 包含在我们的服务器端模板中 not将文本粘贴到使用 ExtractText 插件或重载 require 中 也就是说
  • ASP.NET、C#、IIS、MIME 类型、有条件文件上传

    我的网站上有一个文件上传网络表单 它只需要接受某些格式 或 MIME 类型 以下代码运行完美 但它不会将 DOCX 文件上传到服务器 这是唯一不起作用的文件类型 我仔细检查了每一行代码 甚至进入了 IIS 管理器以确保 DOCX MIME
  • 如何在plolty3.10中绘制排序条形图

    我一直在尝试绘制一些商店销售数据的排序条形图 但无论我尝试什么 它都会给我未排序的数据 如何使用plotly绘制排序后的条形图 NOTE https community plot ly t sort bars in bar chart by
  • 字体文件未随 ASP.NET Bundle 一起加载

    在我的 ASP NET MVC 应用程序中 我使用 Bundle 来压缩 css 和 js 文件 问题是 在我启用优化模式后 字体未加载 BundleTable EnableOptimizations true 这是 C 代码 public
  • 如何使用 Go olivere/elastic 基于多个字段进行排序

    我几天来一直在尝试知道如何使用 Go 根据多个字段进行排序olivere elastic https github com olivere elastic 我正在尝试将其翻译成 Go sort name age desc 我尝试过使用New
  • Jupyter 中对 html 标签和从右到左语言的支持

    在 ipython 笔记本中 我们可以在 markdown 中添加 html 标签 从右到左语言的一个有用标签是 p text p 这方便地使文本右对齐 有没有办法在 Jupyter 中添加 html 标签或从右到左的段落对齐方式 可以这样
  • Xcode 8 / Swift 3:简单的 UIPicker 代码不起作用

    我有协议 class ViewController UIViewController UIPickerViewDelegate UIPickerViewDataSource 我有数据 let muteForPickerData minute
  • 将 javascript 封装在

    将 javascript 代码包装在其中有什么意义 这是我最讨厌的事情之一 这是一种古老的开发人员实践 旨在 保护 不理解的旧浏览器
  • SwiftUI:如何使用 NavigationViews 切换到新的导航堆栈

    我目前正在使用 SwiftUI Beta 5 我有一个工作流程 其中涉及浏览一系列视图 最后一个视图涉及将大量数据填充到应用程序中并结束特定工作流程的操作 下载数据后 用户应该能够启动新的工作流程 我想 忘记 旧的 NavigationVi