以编程方式在子视图中切换标签栏视图(自定义标签栏控制器)

Switch tab bar view in subview programmatically (custom tab bar controller)

因为想重新设计tab barUI,所以根据https://github.com/codepath/ios_guides/wiki/Creating-a-Custom-Tab-Bar

写了一个自定义的tab bar controller

TabBarViewController的viewDidLoad()中,定义了每个标签栏对应的几个子视图

homeViewController = storyboard.instantiateViewControllerWithIdentifier("HomeViewController")
...
viewControllers = [homeViewController, searchViewController, accountViewController, trendingViewController]

以及点击tab时的主要方法

@IBAction func didPressTab(_ sender: UIButton) {

        let previousIndex = selectedIndex
        selectedIndex = sender.tag

        tabButtons[previousIndex!].isSelected = false
        let previousVC = viewControllers[previousIndex!]

        // remove previous VC
        previousVC.willMove(toParentViewController: nil)
        previousVC.view.removeFromSuperview()
        previousVC.removeFromParentViewController()

        // set current VC
        sender.isSelected = true
        let vc = viewControllers[selectedIndex]

        addChildViewController(vc)

        // Adjust the size to match content view
        vc.view.frame = contentView.bounds
        contentView.addSubview(vc.view)
        vc.didMove(toParentViewController: self)
    }

我可以在加载标签栏视图时设置默认标签栏索引 selectedIndex。但是,如何切换到 homeViewController 中的下一个选项卡栏(无需点击选项卡栏按钮)?

这在 homeViewController 中不起作用 TabBarViewController().tabButtons[2].isSelected = true TabBarViewController().didPressTab(TabBarViewController().tabButtons[2])

我不确定如何获取 运行 选项卡控制器、设置 selectedIndex 以及更新子视图控制器中的子视图。

您需要做的就是调用 tabBar.setSelectedViewController: 并传递视图控制器。

如果你只知道选项卡索引,你调用tabBar.viewControllers[index]并获取视图控制器。

我终于用Delegate解决了

在SubViewController中添加协议

protocol SubViewControllerDelegate {
    func transferToView(index: Int)
}

并在 class

中声明

var delegate: SubViewControllerDelegate?

在TabBarViewController中设置为符合SubViewControllerDelegate

实现方法

func transferToView(index: Int) {
    tabButtons[index].isSelected = true
    didPressTab(tabButtons[index])
}

设置委托

subViewController = storyboard.instantiateViewControllerWithIdentifier("HomeViewController")
let subVC = subViewController as! SubViewController
subVC.delegate = self