2011-04-22 3 views
28

Tengo un botón llamado 'INICIO'. En esa acción del botón tengo el siguiente código:popTOViewController

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; 

Cuando hago clic en este botón, la aplicación se cuelga.

Al cambiar el índice de 1 a 2, aparece la vista perfectamente.

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES]; 

Mi punto de vista es la secuencia de la Página 1 -> Página 2 -> Page3

quiero ir de Page3 a la Página 1, pero la aplicación se bloquea. De la Página3 a la Página2 funciona bien.

Respuesta

83

Pruebe esto.

Cuando he escrito SeeMyScoresViewController debe escribir su vista de clase Controller en el que hay que ir. (Ej. Clase de Inicio)

NSArray *viewControllers = [[self navigationController] viewControllers]; 
for(int i=0;i<[viewControllers count];i++){ 
    id obj=[viewControllers objectAtIndex:i]; 
    if([obj isKindOfClass:[SeeMyScoresViewController class]]){ 
     [[self navigationController] popToViewController:obj animated:YES]; 
     return; 
    } 
} 
+1

+1 para usted, como esto también me fue útil en alguna parte ....... – Sabby

+0

esto hace que mi aplicación se cuelgue la próxima vez que haga clic en el botón Atrás (en el SeeMyScoresViewController) – Lucas

18

Si quieres ir a la viewcontroller raíz (page1) sólo tiene que utilizar:

[self.navigationController popToRootViewControllerAnimated:YES]; 

También el primer elemento en un índice no es el elemento 1, pero unidad 0:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES]; 

Esto debería lo llevará de vuelta al primer controlador de vista, pero será más fácil usar el método popToRootViewController.

+0

Has sido 1 minuto más rápido :) – fabian789

+0

hey @rckoenes puedes responder a esta pregunta similar - http://stackoverflow.com/questions/32546217/proper-way-to-call-poptoviewcontroller-ios – Tariq

3

A menudo es más importante hacerlo desde la parte superior de la pila, por lo que:

En UINavigationController subclase o categoría:

- (void)popToLast:(Class)aClass 
{ 
    for (int i=self.viewControllers.count-1; i>=0; i--) 
    { 
     UIViewController *vc = self.viewControllers[i]; 
     if ([vc isKindOfClass:aClass]) 
     { 
      [self popToViewController:vc animated:YES]; 
      break; 
     } 
    } 
} 

y se llama ese

popToLast:[SomeViewController class]; 
+0

que debería ser '[self.navigationController popToViewController: vc animated: YES] ' – TonyTony

+0

@TonyTony Es una subclase UINavigationController personalizada o código de categoría en este ejemplo, ¿no? –

1

Una manera hasta a la fecha de estallar de nuevo a un controlador específico es:

[self.navigationController.viewControllers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

    if ([obj isKindOfClass:[MyViewController class]]) { 
     [self.navigationController popToViewController:obj animated:YES]; 
     *stop = YES; 
    } 
}]; 

MyViewController es el controlador que desea pop volver a.