5

Quiero una pila de navegación global. Cuando el usuario cambia de pestaña o navega a una nueva vista en la misma pestaña, quiero insertar la nueva vista en la pila de navegación global. Quiero que el botón Atrás en la barra de navegación vuelva a la vista anterior, que a veces es una pestaña diferente, y a veces una vista diferente en la misma pestaña.¿Cómo puedo crear una pila de navegación global?

enter image description here

+1

La respuesta de Peter (a continuación) funcionará ... pero esta interfaz de usuario suena muy "Android". Los usuarios esperan que una barra de pestañas funcione como una barra de pestañas ... esto funciona como ninguna otra aplicación que haya usado alguna vez y va en contra de las expectativas de los usuarios (mal). ¿Hay otra interfaz de usuario que puedas usar para lograr el mismo efecto? – nielsbot

+0

también, en mi opinión, la aplicación de Yelp tiene mala interfaz de usuario y no debe usarse como ejemplo :) – nielsbot

Respuesta

0

que podría lograr el mismo ajustando el botón de la barra izquierda de su UINavigationController que el botón de su elección, Manejar el método de acción e invocar el botón de barra de pestañas apropiado en caso de clic.

Es necesario hacer todo lo que en su controlador de vista raíz ...

añadido:

No se podía conseguir el botón Atrás de los controladores de vista de la raíz (controladores de navegación; s vista raíz asociado con su instancia de barra de pestañas) simplemente presionando el botón de la barra de pestañas.

necesita encontrar la manera de lograr esto ya que no está obteniendo esto de iOS Entonces el movimiento que presiona el botón tabbar su necesidad de tener la variable que almacena el índice seleccionado previamente y un método que da la información para cualquier tabbar simplemente pasando el índice ... Entonces, al usar estos dos, puede establecer el título del botón de barra izquierda de la barra de navegación y regresar a la pestaña anterior asignando el método de acción apropiado al botón de la barra izquierda ...

+0

No entendí a qué se refiere? –

+0

@ZiadTamim: vea la respuesta actualizada. – Jhaliya

4

Para lograr este efecto, puede deshacerse del UITabBarController y emular la barra mediante una vista personalizada o personalizando la UIToolbar estándar.

Tenga un controlador de navegación con, con su barra de herramientas personalizada siempre visible, y cuando los botones se tocan sobre él, simplemente presione las vistas que desee en el puerto de navegación.

+0

Sí, es el comportamiento predeterminado estándar –

+0

Erm ... ¿con qué tiene problemas exactamente? –

+0

Quiero que todos los controles UIViewController en el UITabBarController se carguen en el mismo UINavigationController –

0

¿Desea que todos los UIViewController 's en el UITabBarController se carguen en el mismo UINavigationController?

Así que algo como esto:

  ___ RootViewController ___ 
     |       | 
UINavigationController  UITabBarViewController 

en lugar de

   RootViewController 
         | 
    _________ UITabbarViewController _____________________ 
    |       |       | 
UINavigationController UINavigationController UINavigationController 

Usted debe tratar de "experimentar" con su propia costumbre UITabBar

+0

¿Hay algún tutorial o algo útil (guía ...) que pueda ayudarme a hacer eso? –

+0

Puede crear su propia "barra de pestañas", que no es más que un grupo de botones con el estado "seleccionado" deseado. Hago esto todo el tiempo, porque "no me gusta" la interfaz de usuario predeterminada de la barra de pestañas. – basvk

+0

Pero si quiero presentar un controlador de vista modal, el UITabBar no estará oculto ... –

0

que sugieren que cree una matriz global (NSMutableArray) que contendrá objetos NSInvocation. Por lo tanto, cada vez que presiona el controlador de vista, debe crear NSInvocation con el controlador de navegación como destino y popViewConrollerAnimated: como selector. Si toca el elemento de la barra de pestañas, debe configurar el controlador de la barra de pestañas como destino y setSelectedViewController: como selector. También debe especificar controlador de vista actual como parámetro utilizando

- (void)setArgument:(void *)buffer atIndex:(NSInteger)index 

Entonces, cada vez que el pop su pila mundial que necesita sólo llamar [myLastInvocation invoke];

0

Tuve un problema similar.Lo hice así:

Para cambiar la pestaña, utilice: diga, quiere ir a la pestaña 2 y su tercera controlador de vista

self.tabBarController.selectedIndex = 2; 

[self.tabBarController.delegate tabBarController:self.tabBarController didSelectViewController: 
    [[[self.tabBarController.viewControllers objectAtIndex:2] viewControllers] objectAtIndex:3]]; 
+0

¿Puede explicar más su idea, por favor? :) –

0

Lo tengo trabajo. En mi experiencia, necesitaba tener mainTabBarController y detailedNavigationController como dos controladores raíz. Estos dos métodos de UIApplicationDelegate clase de trabajo perfecto:

- (void) showDetailedTab 
{ 
    CGRect normalRect = self.window.bounds; 
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0); 
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0); 

    detailedNavigationController.view.frame = rightRect; 
    mainTabBarController.view.frame = normalRect; 
    [self.window addSubview:mainTabBarController.view]; 
    [self.window addSubview:detailedNavigationController.view]; 

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut 
        animations: ^{ 
         detailedNavigationController.view.frame = normalRect; 
         mainTabBarController.view.frame = leftRect; 
        } 
        completion: ^(BOOL finished){ 
         [mainTabBarController.view removeFromSuperview]; 
        }]; 
} 

- (void) showMainTabBar 
{ 
    CGRect normalRect = self.window.bounds; 
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0); 
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0); 

    mainTabBarController.view.frame = leftRect; 
    detailedNavigationController.view.frame = normalRect; 
    [self.window addSubview:mainTabBarController.view]; 
    [self.window addSubview:detailedNavigationController.view]; 

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut 
        animations: ^{ 
         mainTabBarController.view.frame = normalRect; 
         detailedNavigationController.view.frame = rightRect; 
        } 
        completion: ^(BOOL finished){ 
         [detailedNavigationController.view removeFromSuperview]; 
        }]; 
} 

creo que esta solución es mejor que la emulación de la barra de pestañas, ya que no se rompa el ciclo de vida UIViewContoller 's.

Cuestiones relacionadas