2011-05-23 26 views
54

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

+2

¿Quieres saber si se trataba de un usuario inicia haciendo estallar o hacer estallar en general? –

+0

Podría ser bueno elaborar sobre su objetivo general. Puede haber una manera más fácil de hacer lo que estás tratando de hacer. Si necesita saber si se cambió algún valor o se estableció en la segunda vista, por ejemplo, simplemente debe verificar ese valor. –

+0

Popping es lo que quiero que me cuenten. – Andrew

Respuesta

-7

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

+1

Verifica y repite otra respuesta, y si el cartel lo lee, quizás acepte que como la respuesta correcta –

+0

@ user461864, se refiere al otro Andrew, no a la otra respuesta de Andrew: son diferentes Andrews. Pero tienes razón, la otra respuesta es muy superior; el presente es mucho trabajo extra en comparación. – JohnK

+0

Maldición, tienes razón, pensé que era raro que respondiera dos veces, pero eso explica –

7

UINavigationController tiene una propiedad delegate que emite devoluciones de llamadas delegadas. Por favor, consulte the iOS reference here.

El delegado no tiene una devolución de llamada presionada "botón de retroceso", sino que le indica cuándo algo va a aparecer en la pila de navegación. Cuando presiona hacia atrás, está "sacando" el controlador de la vista superior de la pila, por lo que le indicará que la vista está a punto de aparecer. Creo que esta es la devolución de llamada que estarías buscando.

Puede tener alguna lógica simple para comprobar si es el controlador de vista que está "interesado", y luego puede enviar una notificación, et al.

+1

No hay ningún delegado que muestre cuándo un controlador de uinavigation ha salido de la pila. – Andrew

+0

Dije que UINavigationController tiene un delegado. Si UINavigationController está administrando su jerarquía de vistas, de hecho se devolverá la llamada al delegado, si está configurado. – makdad

+0

Estoy tratando de hacer esto. Cuando se realiza una copia de seguridad, desafortunadamente, se llama al "nuevo" controlador de vista [el que se respalda para] -visualizarAparece antes de que se utilice el método de delegado -navigationController: willShowViewContoller: animated: viewController ... – chadbag

102

La mejor solución que he encontrado para detectar la pulsación del botón Atrás de un UINavigationController (pre-iOS 5.0) es verificando que el controlador de vista actual no está presente en el controlador de navegación ver la pila del controlador.

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

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 utilizar -didMoveToParentViewController:

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

¡Esto funciona genial! Pero mencionaste antes de iOS 5.0 ... ¿Hay un método específico de iOS 5 que se pueda usar para capturar la devolución de llamada del botón de retroceso? – Keller

+3

He actualizado mi respuesta para un nuevo método agregado en iOS 5.0. – Andrew

+4

Esto también se llama cuando se empuja el VC (al menos en iOS 6). – fabian789

75

en su viewWillDisappear cheque método

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    if ([self isMovingFromParentViewController]) { 
     //specific stuff for being popped off stack 
    } 
} 

Esto es sólo para iOS 5 correos

+0

falta paréntesis en la instrucción if, pero de lo contrario es una respuesta muy útil. ¡Gracias! – AddisDev

+2

Como alternativa a esto, inspirado en la respuesta de Andrew, puede hacer algo antes del movimiento anulando 'willMoveToParentViewController:' en lugar de 'didMoveToParentViewController:'. – fatuhoku

+0

Esta solución no funciona, a menos que en iOS 8. –

2

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) { 
     <Do something since we're closing using something else> 
    } else { 
     <Do something since we're closing because of the back button> 
    } 
} 

He intentado utilizar la solución de Zach, pero isMovingFromParentViewController devuelve cierto para ambos casos.

Verifiqué esto funciona en iOS 5 +

espero que esto ayude.

1

Crear una costumbre posterior botón de la barra y fijar el objetivo,

Paso 1: Añadir estos métodos a la 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: Llame a [auto addBackBarButton]; en el método viewDiDLoad

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

¡Salud!

2

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

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

No use 'will', use' did' ya que hay un gesto pop de borde de pantalla. – SoftDesigner

Cuestiones relacionadas