如何从第一个选项卡继续到标签栏控制器的第二个选项卡?
我没有问题,实际上执行segue,但是当我这样做,我的标签栏从视图的底部消失。 我制作了一个从TabBarController1到TabBarController2的故事板。
Objective-Cfind了很多答案,但是没有一个适用于Swift。
这是执行segue的代码:
if requestsArray.count == 0 { self.performSegueWithIdentifier("offerSegue", sender: self) } else { self.performSegueWithIdentifier("confirm1", sender: self) }
你不想继续。 segue创build目标视图控制器的新实例并显示它。
这就是为什么你的标签栏正在消失。 您正在使用TabBarController2的新实例来覆盖标签栏控制器,该标签栏有两个选项卡。
你想切换到其他选项卡。
你想要做的是要求你拥有的标签栏控制器切换标签。
UIViewController
有一个属性tabBarController,可以让你到你拥有的标签栏控制器。
TabBarControllers有一个属性selectedIndex
,可以让你select一个标签栏控制器的视图控制器成为主动视图控制器。
所以,发送消息到你的标签栏控制器,要求它切换到另一个标签。
编辑:
除OP之外的其他人已经要求示例代码说明如何做到这一点。 我决定创build一个示例项目,说明如何做到这一点。
你可以从Github上下载: https : //github.com/DuncanMC/TabBarControllers.git
我为由标签栏控制器pipe理的视图控制器创build了基类UIViewController ATabController
。 ATabController.swift
文件包含一个枚举,用于指示要select哪个选项卡:
@objc enum Tab: Int { case first = 0 case second case third }
(请注意,如果要将Tab
types的parameter passing给IBActions,则枚举必须是Objective-C枚举,因为IBAction方法需要使用Objective-Ctypes和函数签名。)
它还包含一个协议TabController
:
@objc protocol TabController { @objc func switchTab(to: Tab) }
它还定义了一个委托tabDelegate
:
weak var tabDelegate: TabController?
标签栏控制器有一个prepareForSegue( prepare(for:sender:)
),它使用它自己作为tabpipe理的所有视图控制器的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) }
如果您正在寻找如何在标签控制器中从一个标签切换到另一个标签而不使用标签栏,您可以执行此操作
tabBarController?.selectedIndex = [number of tab]