2009-06-23 11 views

Respuesta

0

La única forma que he encontrado hasta ahora es crear una subclase de UINavigationController y sobrescribir el método popToRootViewControllerAnimated para devolver nil.

Este parece ser el método que llama UITabBar cuando se tabula dos veces. No sé si es la forma correcta, aunque ... Me encantaría algunos comentarios sobre el tema ...

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated { 
    return nil; 
} 
1

Me acabo de encontrar con este problema a mí mismo y encontró una manera de hacerlo. Hacer un delegado para su UITabBarController e implementar tabBarController:shouldSelectViewController: para evitar la selección del mismo controlador:

- (BOOL) tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc { 
    return tbc.selectedViewController != vc; 
} 

También puede agregar una lógica más complicada si solo deseas para evitar que en algunos casos.

5

Probablemente no debería evitar este comportamiento. Es una convención estándar de UI de iPhone, como tocar la barra de estado para desplazarse a la parte superior de una vista de desplazamiento.

Si realmente desea hacerlo, debe implementar el UITabBarController método de delegado -tabBarController:shouldSelectViewController:, como se mencionó en mckeed. Sin embargo, si tiene más de cinco pestañas, el selectedViewController puede ser un controlador de vista que se encuentra en la sección "Más", pero vc será [UITabBarController moreNavigationController]. He aquí una aplicación que se encarga de ese caso:

- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc { 
    UIViewController *selected = [tbc selectedViewController]; 
    if ([selected isEqual:vc]) { 
     return NO; 
    } 

    if ([vc isEqual:[tbc moreNavigationController]] && 
     [[tbc viewControllers] indexOfObject:selected] > 3) { 
     return NO; 
    } 

    return YES; 
} 
+1

También recomiendo evitar este comportamiento sin MUCHAS buenas razones. Los usuarios se cabrean cuando un atajo de todo el sistema no está disponible. –

0

Estoy de acuerdo con mantener esto como intencionadas comportamiento, pero al mismo tiempo, las cosas se ponen interesantes con desenrollar la VC pila con gracia (como cuando se edita una serie anidada de datos básicos objetos). En mi caso, equivale a cancelar cada VC.

Por lo tanto, ¿hay alguna forma de que sepa que estamos llegando hasta la raíz VC? Estoy pensando en una operación cancelar/deshacer durante viewWillDisappear no se corta, porque esa misma vista seguramente desaparecería después de un guardado también. Necesito de alguna manera transmitir "estamos cancelando - ¡rescatar!" cuando aparece todo el camino hasta el VC raíz en una pestaña determinada. Verificar una bandera sucia/nueva como una verificación de seguridad dentro de viewWillDisappear tampoco ayuda, ya que esa prueba se llamaría dos veces en el caso de una cancelación legítima (es decir, si el botón cancelar se toca).

+0

Ah-ha. Al principio pensé que las categorías son su amigo, y quizás podría instalar uno en UIViewController e intervenir dentro de popToRootViewControllerAnimated: para alertar a las tropas. Pero eso requeriría la creación de subclases, ¿no es así? (Intento evitar las subclases en Cocoa siempre que sea posible, pero esta puede no ser una de esas veces que es posible). Si hay una forma menos entropía de esto, soy todo oídos. –

Cuestiones relacionadas