Reputation: 7807
Normally when a UINavigationController
is placed in a UITabBarController
the navigation controller pops to root with the respective tab it is in is double tapped. How do I achieve the same effect with a UISplitViewController
is between the tab bar controller and the navigation controller? Ideally it would recurse through the view controller's child view controllers and calling popToRootViewController
on all navigation controllers that it finds. Do I have to add my own gesture recognizer to the tab bar since it doesn't look like there is a hook for knowing when a user has double tapped a tab?
Upvotes: 1
Views: 2448
Reputation: 299
In Swift 4, it can go something like this:
class TabBarViewController: UITabBarController, UITabBarControllerDelegate {
private var shouldSelectIndex = -1
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
shouldSelectIndex = tabBarController.selectedIndex
return true
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if shouldSelectIndex == tabBarController.selectedIndex {
if let splitViewController = viewController as? UISplitViewController {
if let navController = splitViewController.viewControllers[0] as? UINavigationController {
navController.popToRootViewController(animated: true)
}
}
}
}
}
Upvotes: 3
Reputation: 7807
Instead of setting up a UIGestureRecognizer
I simply keep track of the selected index in shouldSelectViewController
and popped to root on my master navigation controller in didSelectViewController
if the old selected index was the same as the new one.
Upvotes: 3