我实际执行segue没有问题,但是当我这样做时,我的标签栏会从视图的底部消失。我已经从TabBarController1到TabBarController2创建了一个故事板segue。
我找到了很多关于Objective-C的答案,但没有找到Swift的答案。
这是执行segue的代码:
if requestsArray.count == 0 {
self.performSegueWithIdentifier("offerSegue", sender: self)
} else {
self.performSegueWithIdentifier("confirm1", sender: self)
}
答案 0 :(得分:18)
你不想贬低。 segue创建目标视图控制器的新实例并显示它。
这就是你的标签栏消失的原因。你正在覆盖你的标签栏控制器,它带有2个标签,带有你的TabBarController2的新实例。
您希望切换到其他标签页。
您要做的是让您拥有的标签栏控制器切换标签。
UIViewController
有一个属性tabBarController,可以让你到达你自己的标签栏控制器。
TabBarControllers有一个属性selectedIndex
,可让您选择其中一个标签栏控制器的视图控制器,使其成为活动视图控制器。
因此,向标签栏控制器发送一条消息,要求它切换到另一个标签页。
您可以从Github下载:https://github.com/DuncanMC/TabBarControllers.git
我为由标签栏控制器管理的视图控制器创建了一个基类UIViewController ATabController
。 ATabController.swift
文件包含一个枚举,用于指示您要选择的标签:
@objc enum Tab: Int {
case first = 0
case second
case third
}
(请注意,如果您要将类型Tab
的参数传递给IBActions,则枚举必须是Objective-C枚举,因为IBAction方法需要使用Objective-C类型和函数签名。)< / p>
它还包括协议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)
}
答案 1 :(得分:13)
如果您正在寻找如何在不使用标签栏的情况下在标签控制器中从一个标签更改为另一个标签,则可以执行此操作
tabBarController?.selectedIndex = [number of tab]