¿Cómo crear una confirmación emergente al presionar el button Atrás en iOS?

Quiero agregar una window emergente cuando alguien pulsa el button "Atrás" de mi aplicación iOS, para preguntar al usuario si realmente quiere volver. Luego, dependiendo de la respuesta del usuario, me gustaría deshacer la acción o continuar. He intentado agregar el código en la function viewWillDisappear de mi vista y luego escribir el delegado adecuado, pero no funciona, porque siempre cambia la vista y luego muestra el pop-up. Mi código es:

-(void) viewWillDisappear:(BOOL)animated { _animated = animated; if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { UIAlertView *alert_undo = [[UIAlertView alloc] initWithTitle:@"UIAlertView" message:@"You could be loosing information with this action. Do you want to proceed?" delegate:self cancelButtonTitle:@"Go back" otherButtonTitles:@"Yes", nil]; [alert_undo show]; } else [super viewWillDisappear:animated]; } 

Y la implementación de los delegates es:

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; if([title isEqualToString:@"Yes"]) { [super viewWillDisappear:_animated]; } } 

Esto no funciona en absoluto. ¿Alguien ahora es una mejor manera de hacerlo o de lo que podría estar mal?

Muchas gracias,

Una vez que se llama -viewWillDisappear: se llama, no hay que detener su viewController de desaparecer.

Idealmente, debe anular el button de retroceso de la barra de navigationBar y en su método, mostrar la alerta ( el rest es más o less lo mismo )

 - (void)viewDidLoad { //... UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordenetworking target:self action:@selector(goBack:)]; [self.navigationItem setBackBarButtonItem: bbtnBack]; } - (void)goBack:(UIBarButtonItem *)sender { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"...Do you want to proceed?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; [alert show]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { switch(buttonIndex) { case 0: //"No" pressed //do something? break; case 1: //"Yes" pressed //here you pop the viewController [self.navigationController popViewControllerAnimated:YES]; break; } } 

NOTA : No olvide declarar <UIAlertViewDelegate> en el file .h de este viewController

Gracias por tu respuesta, @staticVoidMan! Finalmente utilicé su código con algunas modificaciones. El button Atrás no se puede modificar, por lo que se debe crear un button adicional y se debe ocultar el estándar. El único problema es el estilo del nuevo button "Atrás", que no es igual al estándar. El código final es:

 - (void)viewDidLoad { self.navigationItem.hidesBackButton = YES; UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordenetworking target:self action:@selector(goBack:)]; self.navigationItem.leftBarButtonItem = bbtnBack; } - (void)goBack:(UIBarButtonItem *)sender { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"...Do you want to proceed?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; [alert show]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { switch(buttonIndex) { case 0: //"No" pressed //do something? break; case 1: //"Yes" pressed //here you pop the viewController [self.navigationController popViewControllerAnimated:YES]; break; } }