select标签时popup到根视图

我一直在遇到一些我认为可能很容易的麻烦。 我有一个表在我的根视图控制器,当select一个行我推新视图,从那里我去另一个选项卡。

我的问题是如何确保一旦用户点击第一个标签导航控制器将popup到根?

在代理被调用时,每个选项卡在选项卡上被选中。

-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

把下面的代码放在这个委托方法中。

 if ([viewController isKindOfClass:[UINavigationController class]]) { [(UINavigationController *)viewController popToRootViewControllerAnimated:NO]; } 

它在我的应用程序上工作正常。

对于Swift爱好者:

 import UIKit class YourTabBarControllerHere: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() { super.viewDidLoad() self.delegate = self; } func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { if let vc = viewController as? UINavigationController { vc.popViewControllerAnimated(animated: false); } } } 

编辑:斯威夫特3更新,感谢@Justin Oroz指出。

 [self.navigationController popToRootViewControllerAnimated:NO]; 

你想做的事听起来有点奇怪。 您是否阅读了有关组合UINavigationControllers和UITabBarControllers的人机界面指南?

但是,您需要做的是通过为您的UITabBarController设置委托并实现tabBarController:didSelectViewController:delegate方法来检测选项卡的select。 在这个方法中,你需要使用UINavigationController的popToRootViewControllerAnimated:方法回弹到根视图控制器。

在Swift 3.1中

将UITabBarControllerDelegate添加到您的TabBar类:

类YourClass:UITabBarController,UITabBarControllerDelegate {

后:

重写func tabBar(tabBar:UITabBar,didSelectItem item:UITabBarItem){

 let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController yourView .popToRootViewControllerAnimated(false) 

}

首先,你应该创buildUITabbarController的子类并添加Observer:

 - (void)viewDidLoad { [super viewDidLoad]; [self.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil]; } 

当选中tabbar时,我们将在方法中进行处理:

 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"selectedItem"] && [object isKindOfClass:[UITabBar class]]){ UITabBar *bar = (UITabBar *)object; // The object will be the bar we're observing. // The change dictionary will contain the previous tabBarItem for the "old" key. UITabBarItem *wasItem = [change objectForKey:NSKeyValueChangeOldKey]; NSUInteger was = [bar.items indexOfObject:wasItem]; // The same is true for the new tabBarItem but it will be under the "new" key. UITabBarItem *isItem = [change objectForKey:NSKeyValueChangeNewKey]; NSUInteger is = [bar.items indexOfObject:isItem]; if (is == was) { UIViewController *vc = self.viewControllers[is]; if ([vc isKindOfClass:[UINavigationController class]]) { [(UINavigationController *)vc popToRootViewControllerAnimated:YES]; } } } } 

UTabController提供了一个不同的用户界面让用户“popup到root”。 当切换回选项卡时,它将保留之前的完整UINav堆栈。 如果他们第二次点击酒吧项目(点击选定的标签),只有这样才会popup到根目录。 这全是自动的。 一些应用程序,如Instagram,允许第三个水龙头滚动到顶部。

我build议坚持使用默认设置,因为这是用户期望的。

下面是为我工作的。这个代码在swift 3:

1>子类UITabbarController并用一个iVAr实现以下两个方法:
class MyTabBarController: UITabBarController ,UITabBarControllerDelegate { var previousSelectedTabIndex : Int = -1 }

2>将tabbar委托设置在viewdidLoad中

 override func viewDidLoad() { super.viewDidLoad() self.delegate = self // you must do it} func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { self.previousSelectedTabIndex = tabBarController.selectedIndex } func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { if self.previousSelectedTabIndex == tabBarController.selectedIndex { let nav = viewController as! UINavigationController // mine in nav_VC for vc in nav.childViewControllers { if vc is YUOR_DESIRED_VIEW_CONTROLLER { nav.popToViewController(vc, animated: true) return false// IT WONT LET YOU GO TO delegate METHOD } } } return true } 

tabBarController.selectedIndex为您提供选定的选项卡

在tabBarController_shouldSelect_viewController方法中,您可以通过一些简单的计算来设置所需的视图控制器。
如果你没有得到上面的代码玩上面的方法,你来了解如何一起工作