volver - ¿Cómo crear una confirmación emergente al presionar el botón Atrás en iOS?
voice over iphone desactivar (2)
Gracias por su respuesta, @staticVoidMan! Finalmente utilicé tu código con algunas modificaciones. El botón Atrás no se puede modificar, por lo que se debe crear un botón adicional y ocultar el estándar. El único problema es el estilo del nuevo botón "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:UIBarButtonItemStyleBordered
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;
}
}
Quiero agregar una ventana emergente cuando alguien presiona el botón "Atrás" de mi aplicación iOS, para preguntarle al usuario si realmente quiere regresar. Luego, dependiendo de la respuesta del usuario, me gustaría deshacer la acción o continuar. He intentado agregar el código en la función viewWillDisappear de mi vista y luego escribir el delegado adecuado pero no funciona, porque siempre cambia la vista y luego muestra la ventana emergente. 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 delegada 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. ¿Hay alguien ahora una mejor manera de hacerlo o qué podría estar mal?
Muchas gracias,
Una vez que se llama -viewWillDisappear:
no se puede detener la viewController
su viewController
.
Idealmente, debería anular el botón de retroceso de la barra de navigationBar
y, en su método, mostrar la alerta ( el resto es prácticamente igual )
- (void)viewDidLoad
{
//...
UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back"
style:UIBarButtonItemStyleBordered
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 archivo .h de este viewController