2011-10-04 15 views
15

He tenido algunos problemas con algo que pensé que podría ser fácil. Tengo una tabla en mi controlador de vista raíz, cuando se selecciona una fila, presiono una nueva vista y de allí voy a otra pestaña.Pop para ver la raíz cuando se selecciona la pestaña

Mi pregunta es, ¿cómo me aseguro de que tan pronto como el usuario toque la primera pestaña, el controlador de navegación muestre la raíz?

Respuesta

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

Changing me animó ayudado NO realidad. Cuando tenía el ajuste animado en SÍ, mi barra de pestañas y ningún otro botón en el controlador de navegación no funcionaba. – Glogo

3

Lo que estás tratando de hacer suena un poco extraño. ¿Has leído las Pautas de interfaz humana para combinar UINavigationControllers y UITabBarControllers?

Sin embargo, lo que necesita hacer es detectar la selección de la pestaña configurando un delegado para su UITabBarController e implementando el método tabBarController: didSelectViewController: delegate. En este método, debe regresar al controlador de vista raíz utilizando el método popToRootViewControllerAnimated: de UINavigationController.

+0

Si echas un vistazo a Phone.app de Apple, los favoritos y el comportamiento de las pestañas recientes son los mismos que los de OP. –

+0

La aplicación Teléfono no cambia de pestaña cuando selecciona una fila de la tabla: este era el comportamiento que estaba consultando, no aparecía en la raíz cuando el usuario toca una pestaña diferente. –

+0

Ah, sí, la pregunta de OP no es completamente lo que OP quiere decir con "de allí voy a otra pestaña". ¿El usuario selecciona otra pestaña o la aplicación cambia automáticamente? –

25

Se llama al siguiente delegado mientras se selecciona cada pestaña en tabbar.

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

Coloque el código siguiente dentro de este método delegado.

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

funciona bien en mi aplicación.

+0

Muchas gracias funcionó para mí. –

+0

Sí realmente está trabajando en mi aplicación gracias – Pradeep

+0

Realmente muy útil para mí, funciona bien en mi aplicación de acuerdo a mis requerimientos. – ravinder521986

8

Para los amantes 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); 
      } 
    } 
} 

Editar: Swift 3 actualización, gracias a @Justin Oroz por señalarlo.

+0

Como pregunta de OP para el controlador ROOT, debería ser (en la sintaxis de Swift 3) 'vc.popToRootViewController (animated: false)' –

0

En primer lugar, se debe crear subclase de UITabBarController y añadir Observador:

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

Cuando se selecciona barra de pestañas, vamos a procesar en el método:

-(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

El UTabController sugiere una UX diferente para permitir que una usuario "pop to root". Al volver a una pestaña, mantiene la pila completa de UINav desde antes. Si tocan el elemento de la barra una segunda vez (tocando la pestaña seleccionada), solo aparece en la raíz. Eso es todo automático. Algunas aplicaciones, como Instagram, permiten un tercer toque para desplazarse hacia arriba.

Sugiero seguir con los valores predeterminados, ya que eso es lo que los usuarios esperarán.

0

La continuación habían trabajado para mí .Este código en rápida 3:

1> subclase UITabBarController e implementar dos por debajo método con una Ivar:
class MyTabBarController: UITabBarController ,UITabBarControllerDelegate { var previousSelectedTabIndex : Int = -1 }

2> establecer el delegado de barra de pestañas en 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 le dan la pestaña seleccionada

En el método tabBarController_shouldSelect_viewController, puede configurar el controlador de vista que desee con un cálculo sencillo.
si usted no está recibiendo el juego código anterior con tanto método anterior y se llega a saber cómo ambos trabajando juntos

2

En Swift 3.1

Añadir UITabBarControllerDelegate a su TabBar Clase:

clase YourClass : UITabBarController, UITabBarControllerDelegate {

Después:

anulación func barra de pestañas (TabBar: artículo UITabBar, didSelectItem: UITabBarItem) {

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

}

Cuestiones relacionadas