example bar iphone cocoa-touch uiviewcontroller uinavigationcontroller

iphone - example - ¿Hay alguna manera de evitar que un UIViewController se extraiga de la pila de un UINavigationController cuando se toca el backBarButtonItem?



navigation controller swift 4 example (3)

Déjalos retroceder, simplemente no guardes nada a menos que sea completamente válido. Ese es generalmente el enfoque que toma Apple.

Tengo un UINavigationController con un controlador de vista raíz y luego presiono un UIViewController en la pila del controlador de navegación. Cuando el usuario toca el elemento BackBarButtonItem me gustaría poder tener una vista de alerta emergente si se cumplen ciertas condiciones y cancelar el pop del controlador de vista. Por ejemplo, el usuario puede hacer ciertas selecciones, pero algunas combinaciones de ellas pueden no ser válidas, por lo que deseo notificarles para realizar cambios.

Sé que puedo evitar que el usuario genere una combinación no válida o que aparezca una vista de alerta cuando se selecciona la combinación no válida, pero prefiero no hacerlo. El usuario puede estar cambiando las selecciones y puede ser consciente de que cierta combinación no es válida, pero prefiero dejar que seleccionen algo que haga que la combinación sea inválida y luego cambiar otra cosa (y notificarles si no han realizado cambios antes de intentar ir) a la pantalla anterior). Por ejemplo, si impido que seleccionen algo que crea una combinación no válida, es posible que tengan que desplazarse hacia arriba en una pantalla, cambiar algo, luego desplazarse hacia abajo en lugar de hacer una selección y luego desplazarse hacia arriba y cambiar algo.

Usar viewWillDisappear: no funciona porque, aunque puedo producir una vista de alerta, no puedo encontrar una manera de evitar que ocurra el pop. Se muestra la vista de alerta pero el controlador de vista aún aparece y vuelven al controlador de vista raíz (con la vista de alerta que se muestra).

¿Hay alguna forma de evitar que ocurra el pop? Si no es así, ¿vale la pena presentar un informe de error o es innecesario y / o esotérico?


Esto suena como algo más apropiado para un Controlador de Vista Modal que para un Controlador de Vista en una pila de Navegación.

Sin embargo, si estás casado para hacerlo en la pila, sería bueno si pudieras hacer esto con UINavigationControllerDelegate , pero no puedes.

¿Es posible configurar el botón Atrás en deshabilitado, hasta que las entradas sean válidas? Quizás cuando el usuario intenta ingresar algo, pero no es válido, cerca de la parte superior de la Vista tiene una Etiqueta animada en su lugar con texto rojo que le dice al usuario que necesita repararla. Mientras tanto, el botón Atrás está deshabilitado y se vuelve a habilitar después de realizar las correcciones.

O sea realmente creativo con la forma en que funcionan sus controles de interfaz de usuario para garantizar que el usuario nunca pueda ingresar datos incorrectos.


Puede reemplazar el botón Atrás con el que llama al método que desea en loadView

cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(onCancelButtonSelected:)]; self.navigationItem.leftBarButtonItem = cancelButton;

Entonces despúes

-(void)onCancelButtonSelected:(id)sender { if (!hasSavedProduct) { cancelAlert = [[UIAlertView alloc] initWithTitle:@"Product not saved" message:@"Exit without saving?" delegate:self cancelButtonTitle:@"Exit" otherButtonTitles:@"Save", nil]; [cancelAlert show]; [cancelAlert release]; }

luego déjalos ir

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if ([cancelAlert isEqual:actionSheet]) { if (buttonIndex == 0) { NSLog(@"Fine. Exiting without saving"); [self.navigationController popViewControllerAnimated:YES]; } else { NSLog(@"Save here"); } }