使用 NavigationController 在当前 tabBarController 上呈现视图控制器

2023-11-27

当呈现或关闭 VC 时,我不想继续隐藏和显示 tabBar,因为它会造成糟糕的用户体验。相反,我想直接在选项卡栏上呈现下一个 VC,这样当我通过从左向右缓慢拖动来关闭下一个 VC 时,我可以看到隐藏在视图后面的选项卡栏(如下图所示)

请注意,我的应用程序有两个选项卡,其中有两个与之关联的 VC(VCA、VCB)。两个 VC 都嵌入了导航栏。 VCA 继续到 VCA1,VCB 继续到 VCB1。目前,在 VCA 和 VCB 内部,我正在调用以下函数来在 viewWillappear 时完成一些隐藏和取消隐藏(下面的代码)。

self.navigationController?.showViewController(vc, sender: self)

Tabbar behind VC

  // Inside ViewWillAppear Only reappear the tab bar if we successfully enter Discover VC (To prevent drag back half way causing tab bar to cause comment entry to be floating). This code check if we have successfully enters DiscoverVC
    if let tc = transitionCoordinator() {
        if tc.initiallyInteractive() == true {
            tc.notifyWhenInteractionEndsUsingBlock({(context: UIViewControllerTransitionCoordinatorContext) -> Void in
                if context.isCancelled() {
                    // do nothing!
                }
                else {
                    // not cancelled, do it
                    self.tabbarController.tabBar.hidden = false
                }
            })
        } else {
            // not interactive, do it
            self.tabbarController.tabBar.hidden = false
        }
    } else {
        // not interactive, do it
        self.tabbarController.tabBar.hidden = false
    }

----------GOKUL 的工作解决方案------------

戈库尔的回答几乎是正确的。我研究了他的解决方案,并提出了以下改进,以消除冗余 VC 的需要,并消除在 tabVC 出现之前短暂显示的初始 VC。但如果没有 Gokul,我永远不会想出这个!!

此外,Gokul 的方法会给我带来一个错误,因为即使在显示 tabVC 之前我确实有一个初始“正常”VC 作为 LoginVC。如果用户需要登录,则此登录VC 仅是rootVC。因此,在大多数情况下,通过将 rootVC 设置为 tabVC,navVC 将永远不会被注册。

解决方案是将导航控制器和 tabBar 控制器嵌入到一个 VC 中。但只有当 navVC 位于 TabBarVC 之前时它才有效。我不知道为什么,但允许我拥有 navVC-> tabVC-> VC1/VC2 的唯一方法是先用 navVC 嵌入 VC1,然后再次单击 VC1 嵌入 tabVC (它不允许我在之前插入一个) tabVC 和我在嵌入 NavVC 后还必须再次单击 VC1)。

solution


根据您的要求,我们需要对给定的视图层次结构进行一些小的更改

  • 让我一步步解释,

    1. 为了满足您的要求,我们必须添加一个UIViewController(假设初始VC)嵌入一个UINavigationController并使其成为initial viewcontroller.

    2. 然后添加一个UITabbarController与 2 VC (VCA,VCB) // 重要的:没有任何navigationcontroller嵌入的。

    3. Add a segue之间InitalVC and 标签栏控制器具有唯一标识符(例如:初始)

    4. In viewWillAppear of InitalVC执行 segue 如下(InitialVC对于我们的设计来说是不必要的,我们只是用它来桥接navigationController and tabbarController).

          self.performSegueWithIdentifier("Initial", sender: nil)
      
    5. In TabbarController类隐藏你的后退按钮,这确保了初始VC无法到达。

          override func viewDidLoad() {
             super.viewDidLoad()
             self.navigationItem.hidesBackButton = true
          }
      
    6. 现在添加一个segue从之间的按钮VCA and VCA1,这就是它的构建和运行,您将看到 VCA1 显示在 VCA 的选项卡栏上。

  • 我们改变了什么?

    1. 而不是添加UINavigationController inside UITabbarController我们反之亦然。我们不能直接在导航中添加 Tabbar 来执行我们正在使用的操作初始VC它们之间。

Result:

enter image description here

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

使用 NavigationController 在当前 tabBarController 上呈现视图控制器 的相关文章

  • 如何使用 afnetworking 在后台上传任务

    我正在尝试使用 AFNetworking 上传大文件 并在应用程序处于后台时继续上传 我可以很好地上传文件 但是当我尝试使用后台配置时 应用程序崩溃并显示以下堆栈跟踪 异常 EXC BAD ACCESS 代码 1 地址 0x8000001f
  • 下标:使用字符串枚举访问我的字典值

    我想做类似的事情 使用字符串枚举访问我的字典值 我试图重载字典的下标但没有成功 访问字典 let district address JsonKeys district 其中 JsonKeys 是 enum JsonKeys String c
  • 当设置 setVisibleXRangeMaximum 时,iOS-Charts X 轴值无限重复

    我正在尝试绘制一个图表 其中 x 轴是TimeIntervalY 轴是power consumption 由于每天都会有数据 因此将有太多数据无法显示 因此 我想一次显示 5 个值 我通过设置实现了这一点self chart setVisi
  • XCode 调试 - 我可以绕过反汇编代码的单步执行吗

    调试项目时 在 XCode 中设置断点后 我将开始单步执行代码 然后我会遇到反汇编代码 我认为这些代码是对没有可用源代码的各种框架的调用 这是一个正确的假设吗 有没有一种方法 可能通过我尚未找到的项目设置 来抑制此汇编代码的显示 而不必单步
  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • 访问iOS 7隐藏的UITableViewCellScrollView?

    苹果改变了UITableViewCelliOS 7 中的层次结构 使用iOS 6 1 SDK
  • UIWebView 未正确加载 JavaScript - 嵌入式 Facebook 帖子

    Facebook 有一项新功能 允许用户将公共帖子嵌入网页中 我想尝试在 UIWebView 内的 iPhone 应用程序中使用它 转义必要的代码非常简单 但即使我手动转义代码 Web 视图也不会正确加载帖子 JavaScript 根本不起
  • Swift:在 Core Data 中存储自定义类的数组

    我是核心数据新手 但对于我的一个新项目 我想将我的数据保存到核心数据 我想创建一个 Reptile 类 其中包含几个自定义类数组 如果没有核心数据 我会得到这样的东西 import Foundation import UIKit class
  • Xcode UI 测试 - 通过 id 在 Webview 中查找元素

    我们的应用程序是混合的 包含 webview 我正在尝试使用 Xcode UI 测试自动化我们的应用程序 我能够使用以下方法找到网络按钮 let app XCUIApplication app launch let button app s
  • 从 AF.Request 响应获取数据

    我需要使用 Alamofire 的 Post 请求调用的 json 响应中的数据 但由于某种原因我无法访问该数据 我尝试按照 Alamofire github 文档以及这篇文章进行操作从 AF 响应 JSON 获取数据 https stac
  • 防止 UITableView 滚动到某个点以下

    如何让 UITableView 允许在某个索引行上方滚动 但在低于某个点时阻止滚动 例如 如果我有第 1 行到第 100 行 其中在给定时间视图中仅出现 5 行 我希望允许用户在第 1 50 行之间滚动 但在第 50 行可见时阻止进一步向下
  • NSPredicate 使用 RLMResults 作为参数

    我试图通过使用 NSPredicate 进行过滤来获取两组 Realm 数据 并且是不同的对象 之间的差异 但存在一个我无法理解的错误 我的代码 RLMResults topStories KFXTopStory allObjects NS
  • 当 Firebase 函数以 Swift 结束时

    我在我的应用程序中使用 Firebase 它查询大量用户并获取所需的特定数据 但是当它开始查询时 其余功能也继续运行 而不仅仅是查询 所以我无法理解当它结束时 例如在这段代码中 ref observeEventType ChildAdded
  • ios - 使用 SIGPIPE 和 SIG_IGN 的信号函数

    我加入了一个旧项目 我发现了这条线 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptions si
  • 为什么我们需要将 delegate 设置为 self?为什么编译器不默认它?

    I think我完全理解授权的概念 我的问题是 当我们这样做时 class someViewController UIViewController UITableViewDelegate 会吗ever可能我们不想设置tableView de
  • iPhone UIViewController 中的 UIPickerView

    我有一个 xib 其中添加了一个UIViewController名为德尔塔 delta 下的视图由 delta viewcontroller 控制 而不是由文件所有者控制 在三角洲视图中 我有一个UIViewPicker 我的问题是我正在编
  • Sprite-kit:沿圆形路径移动元素

    我正在尝试让一个元素沿着圆圈的边缘移动 我在屏幕中间创建并放置了一个圆圈 var base SKShapeNode circleOfRadius 200 Size of Circle base position CGPointMake fr
  • iOS 上的本地通知需要用户许可吗?

    我在我的应用程序中使用 UILocalNotification 来安排通知 通知工作正常 并在我需要时显示 我对此没有意见 我没有做任何远程 推送通知 让我想知道的是 我从未见过您通常在多个应用程序中看到的推送通知的著名权限对话框 我什至重
  • UITableViewController 无法识别的选择器发送到实例

    当我传递一个整数时 我有一个 tableviewcontroller 和一个detailtableviewcontroller UITableViewController setSurveyNumber 无法识别的选择器发送到实例 Biza
  • 小部件配置在 macOS 上不起作用

    我为我的 iOS 应用程序制作了一个小部件 效果很好 现在我正在将其移植到我的 macOS 应用程序中 但不知何故 小部件配置不起作用 这些项目已显示 但我无法以某种方式选择它们 查看屏幕截图 但请看一下我制作的视频 https youtu

随机推荐

  • 如何在 Perl 中运行时加载模块?

    是否可以在 Perl 中在运行时加载模块 我尝试了以下方法 但没有成功 我在程序的某个地方写了以下内容 require some module import some module some func some func Foo pm pa
  • 检查 pandas DataFrame 中的 dtype 时的注意事项

    由 来指导this回答 我开始建立管道来根据其数据类型处理数据帧的列 但是在获得一些意外的输出和一些调试之后 我最终得到了测试数据帧和测试数据类型检查 Creating test dataframe test pd DataFrame bo
  • 删除 Chrome/IE9 中的图像边框

    我试图摆脱 Chrome 和 IE9 中每个图像出现的细边框 我有这个CSS outline none border none 使用 jQuery 我还添加了border 0每个图像标签上的属性 但如图所示的边框仍然出现 有什么解决办法吗
  • 实现具有独立行高的多列ListView

    我想创建一个包含大约 200 个 ImageView 随机高度 的列表 并以 拼贴 方式使用以下布局 通常我会在 ListView 中执行此操作 以获得通过使用适配器获得的性能 但因为我希望图像按列显示 并且具有不同的高度 参见图片Exam
  • 如何使用 FPDF/FPDI 获得精确修改后的 PDF?

    我有一个修改 PDF 并向其中添加图像的任务 为此我使用了 FPDF 和 FPDI 库 其操作代码如下
  • 访问 jenkins 共享库代码中的环境变量

    当我使用新的共享库时 我无法访问任何直接由 Jenkinsfile 或通过 var groovy 脚本执行的 src 类的环境变量 即使我添加了这个问题仍然存在withEnv到 var groovy 脚本 让环境变量传播到 jenkins
  • 在 10 分钟内触发活动的简单 AlarmManager 示例

    我发现了很多与此类似的问题 但至少我认为它们太复杂 代码太多 这件事能用几行代码完成吗 我想在 10 比方说 分钟内启动一项活动 仅此而已 谢谢 将闹钟设置为 10 分钟 比方说 使用此代码 AlarmManager alarmMgr Al
  • 如何改变 dplyr 中的 for 循环

    我想为数据框中的列创建多个值范围的滞后变量 我的代码可以成功执行我想要的操作 但无法根据我的需要进行扩展 数百次迭代 我的下面的代码成功地完成了我想要的操作 但无法根据我的需要进行扩展 数百次迭代 Lake Lag lt Lake Cham
  • SparkSQL注册表时MissingRequirementError

    我是 Scala 和 Apache Spark 的新手 我正在尝试使用 Spark SQL 克隆后repo我通过输入启动了 Spark shellbin spark shell并运行以下命令 val sqlContext new org a
  • C free() 例程和递增数组指针

    会不会free 如果我动态分配一个数组 然后传递一个指向数组中间的指针 而不是初始指针 那么常规工作会怎样 例子 int array malloc 10 sizeof array if array array 5 adjusting the
  • 使用 Spring Boot 应用程序启用 HTTP 严格传输安全 (HSTS)

    我已经关注了这篇文章https docs spring io spring security site docs 4 0 2 RELEASE reference html headers html headers hsts在我的 Sprin
  • JavaScript location.reload() 正在丢失发布数据

    我正在尝试使用java脚本重新加载页面 页面重新加载 但页面中的帖子数据未加载 帖子数据被删除 而页面重新加载任何人都可以帮助我 function currencychange xxx setTimeout delay 2000 funct
  • 在 Paul Graham 的 ANSI Common Lisp 中编写示例

    谁能解释一下 Paul Graham 的 ANSI Common Lisp 第 110 页中的示例吗 该示例尝试解释使用 rest 和 lambda 来创建函数式编程工具 其中之一是组成函数参数的函数 我找不到任何解释它是如何工作的 代码如
  • 确定操作栏是否拆分

    我有一个MapView带有由 ActionBarSherlock 提供支持的操作栏 操作栏既可以分割 在 窄 屏幕上 也可以覆盖 半透明 android windowActionBarOverlay 为 true 或多或少类似于谷歌地图应用
  • 执行 gem 时...(ArgumentError)未知编码名称 - CP720 [重复]

    这个问题在这里已经有答案了 我现在遇到了这个奇怪的错误 while executing gem ArgumentError unknown encoding name CP720 当我想运行任何 gem 命令时 例如 gem install
  • Location.getTime() 始终返回不带毫秒的时间戳

    我正在跟踪 GPS 位置LocationManager requestLocationUpdates using LocationManager GPS PROVIDER并注册一个LocationListener 我的问题 所有测试的设备
  • Qt 找出 QSpinBox 是否被用户更改

    假设我有一个QSpinBox 我如何查明该值是否是由用户或其他函数手动更改的 编辑 我只想在用户更改值时执行一些操作 但如果您的程序执行此操作 setValue 我不想执行此操作 可能的解决方案 ui gt spinBox gt block
  • AngularJS ui-router:测试 ui-sref

    我正在尝试测试一些正在使用的视图 a link a 链接到我的应用程序中的其他州 在我的测试中 我触发了对此元素的点击 如下所示 element find a click 如果状态切换到 我该如何测试someState 使用时会很容易 st
  • 如何轻松地从 lambda 函数创建比较器?

    我想知道 Net 框架中是否提供了一个实现 IComparer 的类 并且可以从 lambda 函数构造该类 能够做到这一点将会很有用 void SortByLength List
  • 使用 NavigationController 在当前 tabBarController 上呈现视图控制器

    当呈现或关闭 VC 时 我不想继续隐藏和显示 tabBar 因为它会造成糟糕的用户体验 相反 我想直接在选项卡栏上呈现下一个 VC 这样当我通过从左向右缓慢拖动来关闭下一个 VC 时 我可以看到隐藏在视图后面的选项卡栏 如下图所示 请注意