如何在 SwiftUI 中将呈现视图关闭到选项卡视图的根视图?

2023-11-23

我在用着TabView在我的主页上。假设我有 4 个选项卡。 在第二个选项卡上,我可以使用转到另一个视图NavigationLink我使用另外两个视图NavigationLink。然后在最新的视图上,有一个按钮可以呈现视图,我使用.fullScreenCover(因为我想全屏显示它)。

在呈现视图中,我添加了一个X标记在左侧navigationBarItems解雇。我用@Environment(\.presentationMode) var presentationMode and presentationMode.wrappedValue.dismiss()解雇。但它只会将当前视图忽略到前一个视图,而实际上我想将它忽略到视图的根目录,即我的视图的第二个选项卡TabView.

有没有办法做到这一点?因为我查阅了一些文章,但没有任何相关的内容,特别是TabView语境。

我也有一个问题:

  1. 这是正确的使用方法吗.fullScreenCover?或者是否有另一种可能的解决方案,例如呈现全屏样式的模式(如果有任何原因我也不确定)。

任何建议将不胜感激,提前谢谢您。


The presentationMode是一级效果值,即关闭当前显示的屏幕后更改它。

因此,要关闭许多呈现的屏幕,您必须以编程方式实现此操作,如下面的演示所示。

可能的方法是使用自定义EnvironmentKey将其向下传递视图层次结构,无需每个级别视图的紧密耦合(如绑定),并且仅在需要的该级别注入/调用。

使用 Xcode 12.4 / iOS 14.4 测试演示

demo

struct ContentView: View {
    var body: some View {
        TabView {
            Text("Tab1")
                .tabItem { Image(systemName: "1.square") }
            Tab2RootView()
                .tabItem { Image(systemName: "2.square") }
        }
    }
}

struct Tab2RootView: View {
    @State var toRoot = false
    var body: some View {
        NavigationView {
            Tab2NoteView(level: 0)
                .id(toRoot)          // << reset to root !!
        }
        .environment(\.rewind, $toRoot)        // << inject here !!
    }
}

struct Tab2NoteView: View {
    @Environment(\.rewind) var rewind
    let level: Int

    @State private var showFullScreen = false
    var body: some View {
        VStack {
            Text(level == 0 ? "ROOT" : "Level \(level)")
            NavigationLink("Go Next", destination: Tab2NoteView(level: level + 1))
            Divider()
            Button("Full Screen") { showFullScreen.toggle() }
                .fullScreenCover(isPresented: $showFullScreen,
                                        onDismiss: { rewind.wrappedValue.toggle() }) {
                    Tab2FullScreenView()
                }
        }
    }
}

struct RewindKey: EnvironmentKey {
    static let defaultValue: Binding<Bool> = .constant(false)
}

extension EnvironmentValues {
    var rewind: Binding<Bool> {
        get { self[RewindKey.self] }
        set { self[RewindKey.self] = newValue }
    }
}

struct Tab2FullScreenView: View {
    @Environment(\.presentationMode) var mode

    var body: some View {
        Button("Close") { mode.wrappedValue.dismiss() }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SwiftUI 中将呈现视图关闭到选项卡视图的根视图? 的相关文章

  • 通过 iBeacon 监控和测距与 CoreBluetooth scanForPeripheralsWithServices 检测信标

    对于 iOS 对想要扫描 BLE 信标 外设的应用程序施加的限制 存在很多困惑 在阅读了几个博客和 Stack Overflow 答案后 我想看看我是否正确理解了所有问题 如果有什么理解错误或者遗漏的地方请指正 我仅指 iOS 7 及更高版
  • 如何使用 Swift Package Manager 将 SwiftLint 与 iOS 应用程序集成?

    我正在使用 Xcode 11 beta 5 创建一个新的 iOS 应用程序 并且我想使用 Swift Package Manager 而不是 CocoaPods 来管理依赖项 使用 SwiftLint 和 CocoaPods 时的常见模式是
  • 子视图的子层与更高的子视图重叠

    我有一个问题 我正在创建一个UIView这是从方法返回的 这部分很好 但我注意到 当我将子层添加到其中一个子视图时 这些层与子层添加的层次结构中较高的子视图 textView 和 imageView 重叠到testViewCopy出现在这些
  • prepareForSegue 和 PerformSegueWithIdentifier 发送方

    我想知道标题中的函数如何工作以及发送者参数 假设单击按钮调用了performSegue方法 那么这是否也调用了prepareSegue方法 是否在performSegue方法之前但在按下按钮之后调用prepareSegue方法 另外 这两个
  • Firebase Analytics DebugView 收集的事件数据不完整

    我正在将事件发送到 Firebase Analytics 并发现 DebugView 中缺少部分事件参数 下面是发送到 Firebase 的两个相同事件 我检查了 Xcode 调试控制台中是否存在所有参数 缺失的参数似乎是随机的 有时根本没
  • 自定义 OpenVPN iOS 客户端 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发一个自定义 iOS OpenVPN 客户端 我找到了这个原生 OpenVPN 客户端核心源码https staging op
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • 将 Xcode 4.5 新 XIB 文件恢复到 iOS<6

    我已经安装了Xcode 4 5 with iOS6 SDK以及其他用于测试目的的旧 SDK 从 4 3 到 6 0 很美 但是有一个BIG问题 生成一个新的 XIB 文件以兼容 iOS6 这是一个问题 因为我的应用程序需要运行在旧设备 不只
  • Cordova iOS 启动画面

    我无法让闪屏停留在页面加载之前 我已经阅读了谷歌搜索第一页 第二页和第三页中的所有条目 我阅读了 stackoverflow 上发布的所有问题 包括一个很好的解释 https stackoverflow com questions 1800
  • Apple 针对 http 直播流媒体应用程序的政策

    这里有要求 http developer apple com library ios documentation NetworkingInternet Conceptual StreamingMediaGuide UsingHTTPLive
  • 通过应用程序组在应用程序之间通信和保存数据

    iOS 8 昨天发布了一个有关应用程序组的新 API 以前在应用程序之间共享数据和通信有点混乱 我相信这正是应用程序组旨在纠正的问题 在我的应用程序中 我启用了应用程序组并添加了一个新组 但我找不到任何有关如何使用它的文档 文档和 API
  • 如何通过我的 ios 应用程序的指示打开苹果地图应用程序

    我的目标是从 ios 应用程序打开带有方向的地图应用程序 我可以打开地图应用程序 但它没有显示方向 我编写的代码如下 NSString mystr NSString alloc initWithFormat http maps apple
  • Mapkit 在 IOS 13 中使用过多的 CPU

    最近 在一些用户更新到 iOS 13 x 后 我的 iOS 应用程序开始频繁崩溃 在 iOS 12 x 中没有出现该问题 我正在使用 Mapkit 渲染一些 MKPolygons 和 MKPolylines MKPolylines 被删除并
  • 在 UIView 中绘制彩色文本 -drawRect: 方法

    我正在尝试在我的中绘制彩色文本UIView子类 现在我正在使用单视图应用程序模板 用于测试 除了以下内容外 没有任何修改drawRect method 文本已绘制 但无论我将颜色设置为什么 它始终是黑色的 void drawRect CGR
  • SwiftUI 更新主菜单 [已解决] kludgey

    真正的问题 你如何更新mainMenu在 SwiftUI 中 它真的可以工作吗 我在 SwiftUI 中构建了一个基于 MacOS 文档的应用程序 其中包括所有内置的文件菜单命令 即关闭 保存 复制 重命名 等 在保存文档之前 我会验证结构
  • Swift 3 中数组的 indexOf(_:) 方法的替换

    在我的项目 用 Swift 3 编写 中 我想使用从数组中检索元素的索引indexOf 方法 存在于 Swift 2 2 中 但我找不到任何替代方法 Swift 3 中是否有任何好的替代方法或类似的方法 Update 我忘记提及我想在自定义
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • iOS:我如何知道某个属性是否符合 KVO 标准?

    In the 键值观察编程指南 https developer apple com library archive documentation Cocoa Conceptual KeyValueObserving KeyValueObser
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo

随机推荐

  • HTML5 Canvas + 下标和上标

    我想在画布中填充文本作为下标和上标选项 我该如何实现这一目标 请帮忙 由于您不允许在以下位置使用 HTMLdrawText你不能使用
  • 终端 ANSI 颜色不适用于 Inline::Perl5 (Data::Printer)

    以下 Perl 5 脚本 use strict use warnings use Data Printer my a 1 2 3 4 p a 给出输出 注意蓝色 而这个 Perl 6 脚本 use Data Printer from
  • 如果在 Crystal Reports 中重复则抑制字段的公式

    我有一个视图 显示水晶报告上的数据 其中有关税 租金 份额 毛额和净额等字段 我的问题是 如果有人更改数据库中的关税 它会显示 2 行具有不同关税的相同记录 这是正常的从数据库的角度来看 这是一种行为 但如果相同的 ID 具有不同的费率或租
  • Xamarin 中的“XamlCTask”任务意外失败

    我目前在构建 Xamarin Forms 解决方案时遇到问题 我收到一个错误The XamlCTask task failed unexpectedly 我尝试查看 Xamarin 日志和 Stacktrace 但我似乎找不到问题所在 有什
  • makefile 中的 patsubst

    我必须使用不同的 CFLAGS 从同一组 c 创建不同的 o 文件 我想使用 patsubst 从相同的 c 生成不同的 o 文件 我在下面的语句中做错了 请帮忙 我想从同一组 c 源文件生成一组具有 CC CFLAGS 02 c lt o
  • 平台默认字符编码如何影响跨平台性能

    我读过 例如在读取文本文件并将文本导入数组等时使用平台默认字符编码是个坏主意 您能否解释一下这将如何影响跨平台性能 以及如何解决该问题 是否有应该用于跨平台应用程序的编码 谢谢 这与性能无关 而是与显示和读取正确编码的文本有关 有多种方法可
  • setText 不将文本设置为 EditText

    我遇到了一个问题 这是我在近三年的 Android 开发过程中从未遇到过的问题 我想拍照 拍照后EditText活动的内容变得清晰 我正在做的是设置的值EditText to Strings using getText toString 拍
  • \c 中的 377 个字符

    我正在尝试读取 c 中的文件 我有一个 txt 文件 它的内容如下 文件一 txt 文件二 txt 文件三 txt 文件四 txt 当我尝试使用 fopen 读取此文件时 我得到以下输出 文件一 txt 文件二 txt 文件三 txt 文件
  • PyCharm - OS X 上的 $PATH

    我需要在 PyCharm 中调试一个 py 脚本 该脚本使用 unix 二进制文件 如 which grep 等 如果我从终端 bash 启动 py 脚本 则会找到 unix 二进制文件并且所有工作都按预期进行 如果我从 PyCharm 调
  • 如何获取 jpg 文件的深度?

    我想使用 Python 检索 jpeg 文件的位深度 使用 Python 图像库 import Image data Image open file jpg print data depth 然而 对于明显的 24 位图像 这给了我 8 的
  • 如何在 OS X 10.6 上构建 64 位 Python —— 只有 64 位,没有通用的废话

    我只是想在我的开发机器上构建这个 来自 Python org 的二进制安装仍然是 32 位 安装扩展 例如 MySQLdb 让我发疯 试图找出每个扩展的正确标志 澄清 我没有替换系统 Python 我只是将 Python org 二进制文件
  • 阻止通过 http 直接访问文件,但允许 php 脚本访问

    我正在将文件 pdf doc flv 等 加载到缓冲区中 并通过脚本将它们提供给我的用户 我需要我的脚本能够访问该文件 但不允许直接访问它 实现这一目标的最佳方法是什么 我应该使用我的权限执行某些操作还是使用 htaccess 锁定目录 最
  • 是否可以对SVN中存储的内容进行加密?

    如果我将源代码存储在共享托管公司的 SVN 中 是否可以对内容进行加密 这样即使有人有权访问该存储库 他们也无法在普通视图中看到源代码 有这个插件吗 否则我想自己实现这个会很疯狂 这里的正确答案是 找到您信任的托管提供商 如果存在监管问题
  • Xcode - 如何制作弹出菜单[重复]

    这个问题在这里已经有答案了 我想在 Xcode 中制作一个弹出菜单 我该怎么做 我希望它看起来漂亮又专业 以下是使用 UIActionSheet 在 UITextView 中显示弹出菜单以响应长按附件的示例 void attachmentA
  • tmPlot 在命名空间中,但未找到其依赖项

    我有一个使用的包tmPlot函数来自treemap 但是当我尝试使用该函数时 它会抛出一个错误 表明其依赖项之一未加载 Error in tmPlot data index index vSize vSize could not find
  • 将文件复制到网络共享驱动器上

    我有一个网络共享驱动器 serveur folder 我想在其中复制文件 我可以使用特定用户 用户 通行证 在驱动器上写入内容 如何使用 C 访问具有写入权限的共享驱动器 未经测试的代码 但它将类似于 AppDomain CurrentDo
  • 显式复制构造函数或按值隐式参数

    我最近读到 不幸的是忘记了在哪里 编写operator 的最佳方式是这样的 foo operator foo other swap this other return this 而不是这个 foo operator const foo ot
  • 如何在不创建android项目的情况下设置libgdx的assets文件夹?

    有办法做吗 我在谷歌上找不到任何相关的教程 Libgdx 不会强制执行任何特定的层次结构或文件夹命名约定来保存您的资产 以便Gdx files internal myassets libgdx png 在桌面上运行得很好 但是 Androi
  • 如何使用 clang++/libc++ 编译/链接 Boost?

    这个问题的答案为什么不能在 c 0x 模式下用 libc 来 clang 链接这个 boost program options 示例 指出 您需要使用 clang stdlib libc 重建 boost 我正在使用 MacOS Lion
  • 如何在 SwiftUI 中将呈现视图关闭到选项卡视图的根视图?

    我在用着TabView在我的主页上 假设我有 4 个选项卡 在第二个选项卡上 我可以使用转到另一个视图NavigationLink我使用另外两个视图NavigationLink 然后在最新的视图上 有一个按钮可以呈现视图 我使用 fullS