Ios 使用第一个ViewController上的“后退”按钮从选项卡栏打开导航控制器

Ios 使用第一个ViewController上的“后退”按钮从选项卡栏打开导航控制器,ios,swift,xcode,Ios,Swift,Xcode,我知道这个问题在so上被问了很多次,但我之所以问这个问题,只是因为它有着相对不同的地方,而且有些答案已经过时,有些是客观c的,我不能完全理解 用例: 我有一个UITabBar控制器,它工作正常。假设我有4个标签,用户点击标签4中给出的按钮。现在,我必须打开一些视图控制器系列。假设用户要遵循以下模式 4.A-->4.B-->4.C并可以像这样返回到第一个:4.C-->4.B-->4.A 最后,在关闭4.A视图控制器后,还必须允许用户返回Tab4 我所做的: 我能够使用此代码打开视图控制器 let

我知道这个问题在so上被问了很多次,但我之所以问这个问题,只是因为它有着相对不同的地方,而且有些答案已经过时,有些是客观c的,我不能完全理解

用例:

我有一个UITabBar控制器,它工作正常。假设我有4个标签,用户点击标签4中给出的按钮。现在,我必须打开一些视图控制器系列。假设用户要遵循以下模式

4.A-->4.B-->4.C并可以像这样返回到第一个:4.C-->4.B-->4.A

最后,在关闭4.A视图控制器后,还必须允许用户返回Tab4

我所做的: 我能够使用此代码打开视图控制器

let VC1 = storyboard.instantiateViewController(withIdentifier :"myVcId") as! UIViewController
    let navController = UINavigationController(rootViewController: VC1) // Creating a navigation controller with VC1 at the root of the navigation stack.
    self.present(navController, animated:true, completion: nil)
这是打开一个导航控制器,让我按照我的要求导航视图控制器,但我也想做以下事情


我想要的:当我以模式展示导航控制器时,我想在第一个视图控制器上显示后退按钮,我希望如果用户选择后退按钮,它将关闭所有导航控制器,并转到他来自的上一个视图控制器

您需要选择第四个选项卡并将其嵌入导航中,然后执行以下操作

let vc = storyboard.instantiateViewController(withIdentifier :"myVcId") as! UIViewController
self.navigationController?.pushViewController(vc, animated: true)
然后你会看到一个关于第一个vc的返回,返回到该选项卡

self.navigationController?.popToRootViewController(animated: true)

据我所知,您的结构如下: TabBarController,将ViewController作为选项卡,并从中显示导航控制器和其他ViewController,如下所示:

                                     4CVC
                                       |-(push)
                                     4BVC
                                       |-(push)
                                     4AVC
                                       |-(push)
                                newNavController
                                       |-(push)
                                     someVC
                                       |
                                  navController
                                       |
tab1        tab2         tab3         tab4
                   |
                 tabBar

(选项卡栏)-vc->(视图)-present->(导航控制器)-根vc->(视图)


我有两个建议,让它更容易处理

第一选项

将导航控制器用作TabBarController的选项卡,并使作为选项卡的ViewController成为其根视图控制器

(选项卡栏)-vc->(导航控制器)-根vc->(视图)-push->(视图)


第二选项

另一个选项是使用导航控制器作为初始视图控制器,并使选项卡栏成为该导航控制器的根视图控制器

(导航控制器)-根vc->(选项卡栏)-视图->(视图)-推送->(视图)



这两个选项都可以使用,第一个选项应该更容易处理。

您需要实例化navigationController,将4A作为rootViewController

然后,在4A的
viewdiload
中,需要实例化4B,并将其推送到navigationController

最后,在4B viewController的
viewDidLoad
中,您需要实例化4C并将其推送到navigationController的堆栈中

提示:推送所有不带动画的ViewController

这应该是实现您的奇怪场景

编辑:

您需要从选项卡栏中选择第四个选项卡作为navigationController, 它的根视图控制器是最初的VC,然后将 您的新导航控制器,否则您将无法使用
后退
按钮

因此,堆栈应该如下所示:

                                     4CVC
                                       |-(push)
                                     4BVC
                                       |-(push)
                                     4AVC
                                       |-(push)
                                newNavController
                                       |-(push)
                                     someVC
                                       |
                                  navController
                                       |
tab1        tab2         tab3         tab4
                   |
                 tabBar

它会杀死所有导航控制器,然后转到他来自的前一个视图控制器
不可能,没有前一个视图控制器,所以你想杀死应用程序还是什么?您必须重新加载Tabbar并删除此tab4.A-->4.B-->4.C,然后可以像这样返回到第一个选项卡:4.C-->4.B-->4.A可以提供有关此选项的详细说明anything@Lu_不,假设我在视图控制器的任何选项卡上,然后我想显示新的NavigationController\没有这样的用例,但若你们真的想要的话,你们可以通过编程的方式添加这个按钮,并将其保存在用户默认列表中that@Lu_检查更新后的问题,以设置表4为例。有一些特定的条件可以从任何视图控制器在任何级别上实现,所以我需要从这个UINavigation控制器被称为的位置返回。没有,我有一个简单的tabbar控制器。现在我有了一些条件,如果这些条件在任何tabbar视图控制器中都匹配,比如说Tab1或Tab4或任何地方,如果这些条件匹配,那么我想将用户带到新的Modally呈现的UINavigationController。现在他可以从这里转到视图1、视图2和视图3等等。回到视图1,在视图1上,他可能想回到他来的地方,所以我想在第一个视图控制器上显示后退按钮,而不是使用Tab1-Tab4作为TabBarController的ViewController,为每个选项卡创建一个NavigationController,并将它们设置为TabBarController的ViewController。然后使Tab1-Tab4成为NavigationController的RootViewController。而不是以模式显示新的导航控制器,然后只需在现有的导航控制器上按View1-View 3。您没有完全获得它。我到底缺少什么?您想回到最初使用所有这些4A、4B、4C实例化navigationController的地方吗?然后,您需要将新的navigationController推到以前的navController上,否则,您将无法使用
返回
按钮。我编辑了我的答案。我希望这次我答对了。实际上,navController可以从任何选项卡打开。i、 e表1、表2、表3、表4不总是表4。我想把数据返回到openingtab@A.s.ALI将我描述的相同逻辑应用于任何选项卡。