Swift:如何在视图控制器之间切换并使用导航栏在子视图控制器内向后移动 (XLPagerTabStrip)

Swift: How to segue between view controllers and use navigation bar to go backwards within a child view controller (XLPagerTabStrip)

我目前正在实施 XL​​PagerTabStrip (https://github.com/xmartlabs/XLPagerTabStrip),它可以有效地在视图控制器的顶部创建一个标签栏。我希望能够从其中一个选项卡式控制器切换到新的视图控制器,并能够使用导航栏向后移动(如果不可能,则使用自定义版本的导航栏)。

XLPagerTabStrip 提供 moveToViewControllermoveToViewControllerAtIndex 函数在子视图控制器之间导航,但此方法不允许使用导航栏向后移动。

我对 XLPagerTabStrip 不熟悉,但我最近遇到了类似的问题,解决方案是使用 unwind segue 返回到以前的视图控制器。实现起来非常简单,所以可能值得一试。

概念上 XLPagerTabStrip 是在 XLPagerTabStrip 模型创建期间声明和初始化的视图控制器的集合。 如果您已经拥有所有可用的视图控制器,那么使用 UINavigationController 实际上是没有意义的。 您可以创建一个全局变量 previousIndex 来存储以前的 viewController 索引,并允许用户使用规范方法返回:

func moveToViewControllerAtIndex(index: Int)
func moveToViewControllerAtIndex(index: Int, animated: Bool)
func moveToViewController(viewController: UIViewController)
func moveToViewController(viewController: UIViewController, animated: Bool)

关于一个新的 viewController,假设您有 4 个 viewController 构建了您的容器 (XLPagerTabStrip),例如 z1、z2、z3 和 z4。 您可以将 UINavigationController 嵌入到 z4(因此它具有 z4 控制器作为 rootViewController)并开始推送或弹出您的外部视图。当你想 return 到你的 z4 时,你可以 popToRootViewControllerAnimated 到你的 UINavigationController

当你回到 z4 时,你可以在这里处理你的全局变量 previousIndex 以移动到 XLPagerTabStrip.

要导航回您之前的视图选项卡控制器,您最初导航自;

  1. 嵌入您的新视图控制器,您希望从中导航 离开导航栏

  2. 将它的导航栏按钮连接到包含 通过在 2 个视图之间拖动一个 segue 选项卡栏

  3. 在App delegate中创建一个全局变量来存储当前索引 您将在父视图中使用它来确定哪个选项卡视图 要显示的控制器

    var previousIndex: Int = 0 //0 being a random tab index I have chosen

  4. 在您的新视图控制器中(您希望从中继续的视图控制器) viewdidload 函数,创建一个全局变量的实例作为 如下所示,并赋值代表一个指标 包含它的子选项卡栏视图控制器。

    //Global variable instance to set tab index on segue
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.previousIndex = 2
    

您可以根据需要为任意数量的子选项卡连接视图编写此代码,记住设置您希望返回的适当子选项卡索引

  1. 现在,创建一个 class 属性 来引用您的全局变量和父视图中的一个函数,如下所示

    let appDelegatefetch = UIApplication.shared.delegate as! AppDelegate
    

函数

func moveToViewControllerAtIndex(){
    if (appDelegatefetch.previousIndex == 1){
        self.moveToViewControllerAtIndex((self.appDelegatefetch.previousIndex), animated: false)
    } else if (appDelegatefetch.previousIndex == 2){
        self.moveToViewControllerAtIndex((self.appDelegatefetch.previousIndex), animated: false)
    }
}
  1. 您现在可以在父视图控制器的 viewDidLoad 中调用此函数,如下所示。

    moveToViewControllerAtIndex()

运行 你的项目就是这样。