2011-02-13 35 views
10

Quiero empujar un controlador de vista a la pila, y luego mostrar el primero que empujó el nuevo.¿Cómo destaco el controlador de vista debajo de un controlador de vista presionado?

-(void) someMethod { 
    MegaSuperAwesomeViewController *tempVC = [[MegaSuperAwesomeViewController alloc] init]; 
    [self.navigationController pushViewController:tempVC animated:YES]; 
    [tempVC release]; 

    // pop this VC, how? 
} 

EDITAR: Resulta que puedo volver a abrir 2 controladores de vista una vez que haya terminado con el nuevo VC. Todavía no es lo que quería exactamente, pero funciona. La desventaja es que necesito establecer una bandera para indicar que la vista cubierta está completa.

+0

¿Por qué quieres probar a hacer esto? –

+0

Requisito para la aplicación. Alternativamente, podría hacer estallar el controlador de vista actual, luego presionar el siguiente, pero el actual sería liberado antes de completar el empuje. – TigerCoding

Respuesta

16

Aquí es una técnica de viniendo rápidamente dos controladores de vista, que tiene un problema similar de los suyos del controlador de vista actual y su propiedad navigationController se va a desaparecer tan pronto como lo hace el primer estallido:

// pop back 2 controllers on the stack to the setup screen 
// 

// locally store the navigation controller since 
// self.navigationController will be nil once we are popped 
// 
UINavigationController *navController = self.navigationController; 

// retain ourselves so that the controller will still exist once it's popped off 
// 
[[self retain] autorelease]; 

// Pop back 2 controllers to the setup screen 
// 
[navController popViewControllerAnimated:NO]; 
[navController popViewControllerAnimated:YES]; 

alternativamente, puede directamente "parte" en los controladores de navegación pila de controladores de vista:

setViewControllers: animada: Sustituye los controladores de vista actualmente gestionados por el controlador de navegación con el artículos especificados.

  • (void) setViewControllers: (NSArray *) viewControllers animados: (BOOL) animada Parámetros viewControllers Los controladores de vista para colocar en la pila. El orden de adelante a atrás de los controladores en esta matriz representa el nuevo orden de de abajo a arriba de los controladores en la pila de navegación. Por lo tanto, el último elemento agregado a la matriz se convierte en el elemento superior de la pila de navegación. animado Si es SÍ, anime el empuje o haga clic en el controlador de vista superior. En caso negativo, reemplace los controladores de vista sin ninguna animación. Discusión Usted puede usar este método para actualizar o reemplazar el controlador de vista actual apilar sin presionar ni hacer saltar cada controlador explícitamente. Además, este método permite actualizar el conjunto de controladores sin la animación de los cambios, que podrían ser apropiadas en el momento del lanzamiento cuando se quiere volver el control de navegación a un estado anterior .

Si se habilitan las animaciones, este método decide qué tipo de transición a realizar en función de si el último elemento de la matriz artículos ya está en la pila navegación. Si el controlador view se encuentra actualmente en la pila, pero no es el elemento superior, este método usa una transición pop; si es el elemento superior, no se realiza ninguna transición . Si el controlador de vista es que no está en la pila, este método usa una transición de inserción . Solo se realiza una transición , pero cuando finaliza esa transición , todo el contenido de la pila se reemplaza por la nueva vista controladores.Por ejemplo, si los controladores A, B y C de están en la pila y configura los controladores D, A, y B, este método usa una transición pop y la pila resultante contiene los controladores D, A y B

Disponibilidad Disponible en iOS 3.0 y después. Declarado En UINavigationController.h

Por lo tanto, a "desaparecer" el controlador de vista directamente en virtud de que en la pila de navegación, en viewDidLoad de su controlador de vista, se puede hacer esto:

NSMutableArray *VCs = [self.navigationController.viewControllers mutableCopy]; 
[VCs removeObjectAtIndex:[VCs count] - 2]; 
self.navigationController.viewControllers = VCs; 
+0

Gracias por el intento, pero el conjunto de navegación es incompatible con el conjunto de VCs que describe, porque tiene que ser mutable. sin embargo, no es realmente necesario porque puedo recuperar dos VC del nuevo cuando haya terminado. No sé por qué no lo detecté. – TigerCoding

+0

Acabo de agregar un "Mutable" en una edición - pequeño error, la técnica funciona bien. – Bogatyr

+0

no es compatible, así que supongo que tendré que crear una nueva matriz, eliminar la vc y volver a colocar la matriz. Me pregunto si eso causaría problemas ... – TigerCoding

0

Gracias Bogatyr unos la sugerencia de 'party en el array viewcontroller para el controlador de navegación'. Acabo de reemplazar toda la pila con el único controlador de visualización al que quiero cambiar, y luego cierro la sesión de todos los controladores de vista en la pila para asegurarme de que es el único. Funcionó muy bien, ¡gracias!

RatingsTableViewController *newViewController = [[RatingsTableViewController alloc] init]; 
    NSMutableArray * newVCarray = [NSMutableArray arrayWithObjects:newViewController, nil]; 
    self.navigationController.viewControllers = newVCarray; 

    [newViewController release]; 

    NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 

    for (id object in allControllers) { 

      NSLog(@"name VC: %@", object); 
    } 
    [allControllers release]; 
8

Tuve problemas para resolver esto también, así que quería compartir cómo conseguí que esto funcione.

Digamos que usted tiene una pila de VC VC1 siendo la raíz y luego se presiona VC2 y desde VC2 usted quiere empujar VC3 pero una vez empujado no desea que el usuario pueda volver a VC2 pero más bien a VC1 (la raíz). La forma de hacerlo es:

//push VC3 from VC2 
[[self navigationController] pushViewController:VC3 animated:YES]; 

// now remove VC2 from the view controllers array so we will jump straight back to VC1 
NSMutableArray *viewHeirarchy =[[NSMutableArray alloc] initWithArray:[self.navigationController viewControllers]]; 
[viewHeirarchy removeObject:self]; 
self.navigationController.viewControllers = viewHeirarchy; 

Espero que esto ayude a alguien más

+1

Otros métodos dejaron los elementos de navegación del controlador de vista anterior en la pila. Este es el único que funciona correctamente para mí ahora que iOS 7 introduce popGestures. ¡Gracias! – chourobin

+0

Excelente, esto funcionó para mí también. Inicialmente, intentaba hacer esto después de que VC2 empujara VC3 (en el método delegado de UINavigationController) que funciona en iOS8, pero en iOS7 hacerlo directamente después de presionar es necesario para hacer que los elementos de navegación aparezcan correctamente. ¡También significa código más simple! – Rajveer

0
-(void)popToSelf{ 

    NSArray *array = [self.navigationController viewControllers]; 

    for (int i = 0 ; i < array.count ; i++) { 
     UIViewController *currentVC = [array objectAtIndex:i]; 
     if ([currentVC isKindOfClass:[YourViewControllerClass class]]) { 
      [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES]; 
     } 
    } 
} 
Cuestiones relacionadas