一尘不染

如何从第一个标签页选择标签栏控制器的第二个标签页?

swift

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

我找到了很多关于Objective-C的答案,但是没有找到Swift的答案。

这是执行segue的代码:

if requestsArray.count == 0 {
                self.performSegueWithIdentifier("offerSegue", sender: self)
            } else {
                self.performSegueWithIdentifier("confirm1", sender: self)
            }

阅读 312

收藏
2020-07-07

共1个答案

一尘不染

你不想吵架。序列创建目标视图控制器的新实例并显示它。

这就是您的标签栏消失的原因。您将使用2个选项卡以及新的TabBarController2实例来覆盖选项卡栏控制器。

您要 切换 到其他选项卡。

您要做的是让您拥有的标签栏控制器切换标签。

UIViewController 有一个属性tabBarController,可让您进入自己的标签栏控制器。

TabBarControllers具有selectedIndex使您可以选择选项卡栏控制器的视图控制器之一成为活动视图控制器的属性。

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

编辑:

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

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

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

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

(请注意,如果要将类型的参数传递Tab给IBAction,则该枚举必须是一个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)
}
2020-07-07