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