2011-10-04 19 views
15

我一直在遇到一些我认为可能很容易的麻烦。我在我的根视图控制器中有一个表,当选中一行时,我推入一个新视图,然后从那里转到另一个选项卡。当选择标签时弹出到根视图

我的问题是我如何确保一旦用户点击第一个选项卡导航控制器将弹出到根?

回答

3
[self.navigationController popToRootViewControllerAnimated:NO]; 
+0

改变动画为NO实际上帮助了我。当我将动画设置为YES时,我的选项卡栏或导航控制器中的任何其他按钮都不起作用。 – Glogo

3

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

但是,你需要做的是通过设置委托你的UITabBarController和实施tabBarController检测标签的选择:didSelectViewController:委托方法。在这种方法中,您需要使用UINavigationController的popToRootViewControllerAnimated:方法回弹到根视图控制器。而上的TabBar所选的每个选项卡

+0

如果您查看Apple的Phone.app,收藏夹和最近的选项卡的行为与OP所需的行为相同。 –

+0

当您选择表格行时,电话应用程序不会切换选项卡 - 这是我查询的行为,而不是在用户点击不同选项卡时弹出到根目录。 –

+0

啊,是的,OP的问题并不完全是OP的意思,“从那里我去另一个标签”。用户是否选择了另一个标签或应用程序是否自动切换。 –

25

以下委托调用。

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

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

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

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

+0

非常感谢它为我工作。 –

+0

是的,它真的在我的应用程序中工作,谢谢 – Pradeep

+0

对我来说真的很有帮助,根据我的要求,在我的应用程序中正常工作。 – ravinder521986

8

对于斯威夫特的恋人:

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指出了这一点。

+0

作为OP的问题问ROOT控制器,它应该是(在Swift 3语法中) 'vc.popToRootViewController(animated:false)' –

0

首先,你应该创建的UITabBarController的子类,并添加观察报:

- (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]; 
      } 
     } 
    } 
} 
0

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

我建议用缺省值作为坚持就是用户将被期待。

0

的下面曾我在迅速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方法中,您可以通过一些简单的计算来设置所需的视图控制器。
如果你没有得到与上述两种方法上面的代码舞台上,你会知道如何都一起工作

2

在雨燕3.1

添加UITabBarControllerDelegate到您的TabBar类:

类YourClass :的UITabBarController,UITabBarControllerDelegate {

后:

覆盖FUNC的TabBar(的TabBar:UITabBar,didSelectItem项目: UITabBarItem){

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

}

相关问题