2011-01-07 13 views
5

En mi aplicación tengo un controlador de navegación básico. Para todos mis puntos de vista, excepto uno, el controlador funciona como debería.iPhone: ¿Cómo anulo el botón Atrás en un Controlador de navegación?

Sin embargo, para una vista en particular, me gustaría que el botón 'atrás' no vuelva a la vista anterior, sino que vaya a uno que configuré. En particular, va a retroceder 2 vistas y omitirá una.

Después de hacer algunas investigaciones he encontrado que puedo interceptar la vista cuando desaparece, por lo que trató de poner en el código para que se vaya a la página me gustaría:

- (void)viewWillDisappear:(BOOL)animated { 
[super viewWillDisappear:animated]; 
//i set a flag to know that the back button was pressed 
if (viewPushed) { 
    viewPushed = NO; 
} else { 
    // Here, you know that back button was pressed 
    mainMenu *mainViewController = [[mainMenu alloc] initWithNibName:@"mainMenu" bundle:nil]; 
    [self.navigationController pushViewController:mainViewController animated:YES]; 
    [mainViewController release]; 
} 

}

Eso no funcionó, entonces ¿alguien tiene alguna idea?

Gracias!

Respuesta

12

En su código, parece que intenta insertar otro controlador de vista en la pila, en lugar de extraer un elemento adicional de él.

Prueba este ejemplo el código que hace que se remontan a los dos niveles:

NSArray *vcs = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[vcs objectAtIndex:[vcs count]-3]; 

alternativa usted puede sustituir totalmente el botón de vuelta con un botón de su propio? En su viewController:

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(doSomething:)]; 

self.navigationItem.hidesBackButton = YES; 
self.navigationItem.leftBarButtonItem = item; 
[item release]; 

entonces usted puede escribir el doSomething: Método para hacer estallar los dos elementos de la pila, tal vez utilizando el código que he publicado anteriormente.

+0

¡Hasta ahora eso funciona genial! ¡¡Gracias por su respuesta!! Pude crear el botón personalizado, crear el método y construir la matriz con la lista de vistas abiertas. Sin embargo, recibo un error de 'excepción no detectada' cuando paso por la línea popToViewController ... Incluso probé esto: [self.navigationController popToViewController: [vcs objectAtIndex: 1]]; en vano. Estoy investigando más sobre popToViewController ahora. –

+0

Terminé usando: [self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex: 0] animado: YES]; volver los dos niveles ... funciona muy bien hasta ahora, ¡así que gracias! –

+0

Si solo quiere volver al nivel superior, hay popToRootViewControllerAnimated: que debería funcionar. –

2

Puede intentar implementar el delegado UINavigationBarDelegate. Cuando se llama al método -navigationBar:didPopItem:, puede extraer un elemento adicional del UINavigationController, y así extraer dos elementos a la vez.

+0

Esto también es más o menos la forma de anular el método UINavigationController popViewControllerAnimated por ejemplo para confirmar la navegación hacia atrás. Con la diferencia de que tienes que implementar el - (BOOL) navigationBar: (UINavigationBar *) navigationBar shouldPopItem: (UINavigationItem *) método de elemento de UINavigationBarDelegate. –

3

solución simple:

- (void)viewWillDisappear:(BOOL)animated { 
    //if true, back was pressed 
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { 
      //your logic 
    } 
} 
+0

Solución limpia. Funciona en iOS 9. Gracias. –

+0

¿Qué sucede si quiero verificar una condición antes de volver a navegar y si esa condición falla? Luego quiero detenerla para volver atrás. usted sabe Windows o Android entonces quiero algo como e.handled = verdadero, como una cosa. – Yawar

-1
UIButton *home = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *homeImage = [UIImage imageNamed:@"back.png"]; 
[home setBackgroundImage:homeImage forState:UIControlStateNormal]; 
[home addTarget:self action:@selector(LogOut) 
forControlEvents:UIControlEventTouchUpInside]; 
home.frame = CGRectMake(0, 0, 69, 26); 
UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithCustomView:home]; 
[[self navigationItem] setLeftBarButtonItem:button2]; 
[button2 release]; 
button2 = nil; 
Cuestiones relacionadas