Averigüe si el usuario presionó el botón Atrás en uinavigationcontroller?

Cuando se carga una vista, quiero ver si es porque el usuario presionó el botón Atrás. ¿Cómo puedo verificar esto?

La única forma de hacerlo es asegurarse de que era el botón Atrás y crear un botón personalizado. Si no sabes cómo hacerlo, mira este tutorial . No se verá exactamente como el botón de retroceso normal, pero está cerca. Si necesita más ayuda, publique un comentario

La mejor solución que he encontrado para detectar la pulsación del botón Atrás de un UINavigationController (anterior a iOS 5.0) es verificar que el controlador de vista actual no está presente en la stack del controlador de vista del controlador de navegación.

Es posiblemente más seguro comprobar esta condición en - (void)viewDidDisappear:(BOOL)animated lógicamente, cuando se llama al método sería muy probable que el controlador de vista se haya eliminado de la stack.

Pre-iOS 5.0:

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (![[self.navigationController viewControllers] containsObject:self]) { // We were removed from the navigation controller's view controller stack // thus, we can infer that the back button was pressed } } 

iOS 5.0+ puede usar -didMoveToParentViewController:

 - (void)didMoveToParentViewController:(UIViewController *)parent { // parent is nil if this view controller was removed } 

en su vista Verificará el método de desaparecer

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ([self isMovingFromParentViewController]) { //specific stuff for being popped off stack } } 

Esto es solo para publicar iOS 5

UINavigationController tiene una propiedad de delegate que emite retrollamadas de delegado. Por favor, consulte la referencia de iOS aquí .

El delegado no tiene una callback presionada “back button pressed”, sino que le indica cuándo aparecerá algo en la stack de navegación. Cuando presiona hacia atrás, está “sacando” el controlador de la vista superior de la stack, por lo que le indicará que la vista está a punto de aparecer. Creo que esta es la callback que estarías buscando.

Podría tener alguna lógica simple para verificar si el controlador de vista está “interesado”, y luego podría enviar una notificación, et al.

En aras de la exhaustividad, mezcla de las dos respuestas más upwoted ( 1 , 2 ) en Swift:

 override func willMoveToParentViewController(parent: UIViewController?) { super.willMoveToParentViewController(parent) if parent == nil { // view controller is popping } } 

Este es un escenario ligeramente diferente, pero pensé que la solución podría ayudar a otros.

En mi situación, tenía un UINavigationController dentro de un UIPopoverController. Necesitaba detectar si el usuario hizo clic en el botón Atrás, o hizo clic fuera del popover. Para hacer esto, verifiqué la propiedad visibleViewController en viewWillDisappear. Si el controlador de vista sigue siendo visibleViewController al cerrarse, entonces el popover se cierra por otros medios. Si el controlador de vista no es visibleViewController al cerrar, se presionó el botón Atrás.

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (self.navigationController.visibleViewController != self) {  } else {  } } 

Intenté usar la solución de zach, pero isMovingFromParentViewController devuelve verdadero para ambos casos.

Verifiqué que esto funciona en iOS 5+

Espero que esto ayude.

Crea un botón personalizado en la barra trasera y establece el objective,

Paso 1: agrega estos métodos a tu clase

 - (void)backButtonClicked :(id)sender{ [self.navigationController popViewControllerAnimated:YES]; } - (void)addBackBarButton{ UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, 0, 55, 35); [button setTitle:@"back" forState:UIControlStateNormal]; [button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; self.navigationItem.leftBarButtonItem = customBarItem; } 

Paso 2: Llamar a [self addBackBarButton]; en el método viewDiDLoad

Obtendrá la acción en el método backButtonClicked . Puedes jugar con él de la manera que quieras.

¡Aclamaciones!