以编程方式在子视图中切换标签栏视图(自定义标签栏控制器)
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
因为想重新设计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