SwiftUI:再次点击所选选项卡时弹出到根视图

2024-04-20

起点是 TabView 中的 NavigationView。我正在努力寻找一个 SwiftUI 解决方案,以便在再次点击所选选项卡时弹出到导航堆栈中的根视图。在 SwiftUI 之前的时代,这很简单:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    let navController = viewController as! UINavigationController
    navController.popViewController(animated: true)
}

你知道如何在 SwiftUI 中实现同样的事情吗?

目前,我使用以下依赖于 UIKit 的解决方法:

if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
                
    let navigationController = UINavigationController(rootViewController: UIHostingController(rootView: MyCustomView() // -> this is a normal SwiftUI file
         .environment(\.managedObjectContext, context)))
    navigationController.tabBarItem = UITabBarItem(title: "My View 1", image: nil, selectedImage: nil)
                
    // add more controllers that are part of tab bar controller
                
    let tabBarController = UITabBarController()
    tabBarController.viewControllers = [navigationController /* ,  additional controllers */ ]
    
    window.rootViewController = tabBarController // UIHostingController(rootView: contentView)
    self.window = window
    window.makeKeyAndVisible()
}

这是可能的方法。为了TabView它提供与点击另一个选项卡然后返回相同的行为,因此提供持久的外观和感觉。

已测试并适用于 Xcode 11.2 / iOS 13.2

完整模块代码:

import SwiftUI

struct TestPopToRootInTab: View {
    @State private var selection = 0
    @State private var resetNavigationID = UUID()

    var body: some View {

        let selectable = Binding(        // << proxy binding to catch tab tap
            get: { self.selection },
            set: { self.selection = $0

                // set new ID to recreate NavigationView, so put it
                // in root state, same as is on change tab and back
                self.resetNavigationID = UUID()
        })

        return TabView(selection: selectable) {
            self.tab1()
                .tabItem {
                    Image(systemName: "1.circle")
                }.tag(0)
            self.tab2()
                .tabItem {
                    Image(systemName: "2.circle")
                }.tag(1)
        }
    }

    private func tab1() -> some View {
        NavigationView {
            NavigationLink(destination: TabChildView()) {
                Text("Tab1 - Initial")
            }
        }.id(self.resetNavigationID) // << making id modifiable
    }

    private func tab2() -> some View {
        Text("Tab2")
    }
}

struct TabChildView: View {
    var number = 1
    var body: some View {
        NavigationLink("Child \(number)",
            destination: TabChildView(number: number + 1))
    }
}

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

SwiftUI:再次点击所选选项卡时弹出到根视图 的相关文章

  • iOS Swift 中断键盘事件

    我在拦截键盘事件时遇到问题 我已将我的 iOS 与 SteelSeries Free 游戏手柄控制器 连接 当连接到 iOS 时 它将被检测为蓝牙键盘 这是在我打开Notes时测试的 按下游戏手柄上的任何按钮都会写一个字母 我需要拦截此按钮
  • 快速布尔运算

    这实在令人困惑 有人有什么想法吗 let viewHasMovedToRight false initially I want this to be false then func moveViewToRight sender UIButt
  • 具有自签名证书的 Alamofire / ServerTrustPolicy

    我想使用 Alamofire 通过带有自签名证书的 https 连接与我的服务器进行通信 我的环境在本地主机上运行 我尝试连接 但响应始终如下所示 Success false Response String nil 我用下面的代码完成了它
  • Swift - 必须由子类覆盖的类方法

    是否有一种标准方法可以在 Swift 中创建 纯虚函数 即 一个must被每个子类覆盖 如果不是 会导致编译时错误 您有两个选择 1 使用协议 将超类定义为协议而不是类 Pro 编译时检查每个 子类 不是实际的子类 是否实现了所需的方法 C
  • prepareForSegue 和 PerformSegueWithIdentifier 发送方

    我想知道标题中的函数如何工作以及发送者参数 假设单击按钮调用了performSegue方法 那么这是否也调用了prepareSegue方法 是否在performSegue方法之前但在按下按钮之后调用prepareSegue方法 另外 这两个
  • Swift Firebase - 如何在使用 queryOrdered(byChild: ).queryEqual(toValue: ) 时获取所有 k/v

    root reviews postABC postId reviewXYZ I want everything under this reviewUID buyerUID 01010 text fast shipping responseT
  • 使用 Metal 高效计算 UIImage/CIImage 中有多少透明像素

    我们可以计算有多少个透明像素的最快方法是什么CIImage UIImage 例如 如果我们谈论效率 我的第一个想法是使用Metal Kernel使用任一CIColorKernel左右 但我不明白如何使用它来输出 计数 我还有其他想法 使用某
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • 在 Firebase 中为 TextView Swift 保存字体和大小的方法是什么

    我想在 Firebase 中保存 Swift 中 TextView 的字体 大小和对齐方式 这样我就可以在另一个视图中调用它 我只能将颜色保存在 Firebase 中 这是显示我是如何做到的的代码 IBAction func SendBtn
  • 具有透明背景的 Swift 模态视图控制器 [重复]

    这个问题在这里已经有答案了 我知道这个话题很受欢迎 但我在编程语言中遇到了一些问题 事实是我仍然不明白我把代码放在哪里 好吧 我就来说说整个案子 我正在尝试制作一个与正常情况稍有不同的模态 Swift 通过单击按钮 ViewControll
  • Audiokit 修剪音频

    我正在制作音频编辑应用程序 我想修剪我的音频 对于音频编辑 我使用 AudioKit 框架 但我在教程和示例中找不到如何使用此框架修剪音频 异步导出允许设置开始和结束样本 https github com AudioKit AudioKit
  • SwiftUI - 从 NSObject 继承的 ObservableObject 在 iOS 13 中不会更新

    我知道 这是 无法在 iOS XX 中工作 问题之一 但我完全陷入困境 所以我有一个ObservableObject继承自的类NSObject 因为我需要听委托方法UISearchResultsUpdating class SearchBa
  • 删除具有estimatedItemSize 的项目时 UICollectionView 单元格大小会调整

    我有一个简单的项目 其中的故事板仅包含一个UICollectionViewController 使用 Xcode 7 1 1 为 iOS 9 1 构建 class ViewController UICollectionViewControl
  • HStack 中的 SwiftUI EditButton 未激活编辑模式

    作为更大表单的一部分 我希望有一个带有列表的部分 其条目可以重新排序 在整个视图中 应该只能编辑该特定列表 而不能编辑其他内容 因此我希望将编辑按钮放在列表附近 如果我只是将 EditButton 设置为节标题 则可以对列表项重新排序 但无
  • Swift 包管理器:“多个目标名为...”

    我正在尝试构建一个服务器端 Swift Web 应用程序 我的应用程序的基础框架将是Kitura https www kitura io来自IBM 此外 我还想利用AWS SDK Swift https github com noppoMa
  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓

随机推荐

  • 引导标签之间没有间距

    在我的应用程序中 我试图有几个连续的标签 就像这样jsbin http jsbin com hesav 1 相反 我得到这个 正如您所看到的 标签之间没有间距 这可能是因为我的CSS有问题 但我无法找到罪魁祸首 bootstrap 中定义的
  • Marionette.Renderer、Underscore 模板和 i18next 国际化

    我们目前需要使用 Backbone Marionette 和下划线模板向中型应用程序添加国际化 经过一番彻底的研究后 出现了两种有效的选择 下属18n https github com ggozad underi18n它提供与下划线的直接集
  • 从多个表中选择 Sequelize

    我目前正在使用sequelize开发一个系统 我需要一个查询来从多个表中获取数据 如下所示 Select Courses id Rooms DisplayLabel Periods DisplayName Subjects Name fro
  • 对超过 UInt16 屏障的程序集信息进行版本控制

    过去 我通常使用变更集或 svn 编号来对二进制文件进行版本控制 例如1 1 123 3 其中较大的数字是来自源代码控制系统的变更集或版本 然而 对于我现在使用的系统 我们已经远远超过了类似 70000 变更集的 uint 障碍 因此在用作
  • jQuery dataTables - 获取过滤的列值

    我正在使用 jQuery dataTable 当用户选择一个下拉列表时 它会搜索数据表并对其进行过滤 并根据搜索到的数据重新绘制内容 mtTable columns each function mtTable column 22 searc
  • javascript 之谜:两个对象在构造函数、原型和 __proto__ 链接方面看起来相同,但行为不同

    我是一位经验丰富的面向对象程序员 但这让我着迷 为什么我可以执行 new f 而不能执行 new a 我将不胜感激任何指点 first a few facts if Object instanceof Function console lo
  • 如何使批量插入适用于多个表

    当存在外键关系时 如何使用SQL Server批量插入插入到多个表中 我的意思是桌子是这样的 CREATE TABLE dbo UndergroundFacilityShape FacilityID int IDENTITY 1 1 NOT
  • VSCode - 光标在 AltGr 上向左移动。如何修复它?

    如果我在 vscode 编辑器中输入以下文本 http stackoverflow com Link to Stackoverflow omg 我得到这个结果 https stackoverflow com Link to Stackove
  • 如何在 Objective-C 中调试单例

    我的应用程序包含几个单例 以下是本教程 http cocoawithlove com 2008 11 singletons appdelegates and top level html 然而 我注意到 当应用程序因单例而崩溃时 几乎不可能
  • 如何在 PowerShell 中重命名文件?

    我有 2 个任务需要使用 PowerShell 来完成 1 我还需要将所有index asp重命名为Default aspx 2 我有一个目录C WWW我需要重命名所有 asp文件到 aspx 递归地 我已经尝试过Rename Item命令
  • PHP ORA-01745: 无效的主机/绑定变量名警告

    01745 运行滚动代码时发出无效主机 绑定变量名称警告 我不确定为什么会发生这种情况请帮忙 我觉得我的绑定一定有问题 但我看不出它有什么问题 我的 Start 和 End 变量看起来像 DD MM YY 我在下面列出了 PHP 代码 谢谢
  • 在reactjs中,数组或迭代器中的每个子元素都应该有一个唯一的“key”属性

    我完全困惑了 因为我的控制台出错了 我阅读了reactjs文档和stackoverflow上的所有提示 但我不明白问题是什么 我看到书名列表 item volumeInfo title 但控制台有错误 这是我的代码 import React
  • 将 NSNumber 与 0 进行比较不起作用?

    我的应用程序中有一个 JSON 解析器 我将值加载到detailDataSourceDict 变量中 当我尝试获取数组的 valueForKey 并尝试将其与 0 进行比较时 它永远不会起作用 这是我的代码 if indexPath row
  • 无法使用 JMS 应用程序从 IBM MQ 获取响应

    我们使用 IBM MQ 以请求 回复方式与第三方进行通信 我们向他们发送请求 他们给我们答复 目前 我们都有一个简单的基于 Java 的本机 IBM MQ 应用程序 我们计划使用 spring jms 重写我们的代码 但是当使用 sprin
  • Pygame 等待屏幕更新

    我刚刚开始使用 pygame 我只是想在屏幕上移动点 问题是它发生得很快 当循环运行时我的 pygame 屏幕冻结 没有响应 然后只显示点的最后一次迭代位置 我认为更新速度很快 当我包括pygame event wait 然后 当我输入输入
  • 如何从 Firestore 中多个文档的数组中删除元素?

    我有一个用户集合 每个用户都有一个名为的数组favoriteNames root lt Firestore users lt Collection uid lt Document favoriteNames Ana Jane Dave lt
  • 支持 Open Mobile API 的手机

    据我了解 要从 Android 应用程序访问 SIM eSE 我们需要在 Android Studio 上安装 Open Mobile API 插件 然而 它真的不适用于所有 NFC 手机吗 例如 某些 OEM 是否限制对 SIM eSE
  • 如何在 mongoose,Node.js 中通过 var 设置键?

    我没有设置变量更新的键 我的代码 mongoose model members Schema update id 0 push this key value function err data if I use var this key t
  • Spark View 引擎与类 Html 属性的绑定

    我一直在使用Bindings http sparkviewengine com documentation bindingsSpark 视图引擎的功能取代了我的很多 Html 帮助器方法调用 我遇到的一个问题是我想定义一个 css 类来传递
  • SwiftUI:再次点击所选选项卡时弹出到根视图

    起点是 TabView 中的 NavigationView 我正在努力寻找一个 SwiftUI 解决方案 以便在再次点击所选选项卡时弹出到导航堆栈中的根视图 在 SwiftUI 之前的时代 这很简单 func tabBarControlle