如何从第一个选项卡中切换到标签栏控制器的第二个选项卡?

问题描述 投票:8回答:2

我没有问题实际执行segue,但是当我这样做时,我的标签栏从视图的底部消失。我已经从TabBarController1到TabBarController2创建了一个故事板segue。

我已经为Objective-C找到了很多答案,但没有为Swift找到答案。

这是执行segue的代码:

if requestsArray.count == 0 {
                self.performSegueWithIdentifier("offerSegue", sender: self)
            } else {
                self.performSegueWithIdentifier("confirm1", sender: self)
            }
ios swift segue
2个回答
18
投票

你不想贬低。 segue创建目标视图控制器的新实例并显示它。

这就是你的标签栏消失的原因。你正在覆盖你的标签栏控制器,它有2个标签,带有你的TabBarController2的新实例。

您想切换到其他选项卡。

你想要做的是让你自己的标签栏控制器切换标签。

UIViewController有一个属性tabBarController,可以让你到达你自己的标签栏控制器。

TabBarControllers有一个属性selectedIndex,它允许您选择一个标签栏控制器的视图控制器以成为活动视图控制器。

因此,向标签栏控制器发送一条消息,要求它切换到另一个标签。

编辑:

除了OP之外的其他人已经要求提供说明如何执行此操作的示例代码。我决定创建一个示例项目来说明如何做到这一点。

你可以从Github下载它:https://github.com/DuncanMC/TabBarControllers.git

我为由标签栏控制器管理的视图控制器创建了一个基类UIViewController ATabControllerATabController.swift文件包含一个枚举,用于指示要选择的选项卡:

@objc enum Tab: Int {
  case first = 0
  case second
  case third
}

(请注意,如果您要将Tab类型的参数传递给IBActions,则枚举必须是Objective-C枚举,因为IBAction方法需要使用Objective-C类型和函数签名。)

它还包括一个协议TabController

@objc protocol TabController {
  @objc func switchTab(to: Tab)
}

它还定义了一个委托tabDelegate

weak var tabDelegate: TabController?

标签栏控制器有一个prepareForSegue(prepare(for:sender:)),它用来使自己成为它管理的所有视图控制器的tabDelegate标签:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if let child = segue.destination as? ATabController {
    child.tabDelegate = self
  }

然后它实现了switchTab(to:)方法:

@objc func switchTab(to: Tab) {
  let index = to.rawValue
  guard let viewControllerCount = viewControllers?.count,
    index >= 0 && index < viewControllerCount  else { return }
  selectedIndex = index
}

在任何作为选项卡栏控制器选项卡的子视图控制器中,您可以使用这样的IBAction代码来切换选项卡:

@IBAction func handleFirstButton(_ sender: Any) {
  tabDelegate?.switchTab(to: .first)
}

13
投票

如果您正在寻找如何在不使用选项卡栏的情况下在选项卡控制器中从一个选项卡更改为另一个选项卡,则可以执行此操作

tabBarController?.selectedIndex = [number of tab]