iphone - Para detener la segue y mostrar alerta
ios ios5 (3)
Utilizando storyboards iOS 5, en un botón estoy realizando un segue, lo que quiero es hacer la validación en mi campo de texto y si la validación falla, tengo que dejar de segue y lanzar una alerta. ¿Cuál es la manera de hacerlo?
Si su destino de despliegue es iOS 6.0 o posterior
Simplemente puede implementar el shouldPerformSegueWithIdentifier:sender:
en su controlador de vista de origen. Haga que este método devuelva YES
si desea realizar el cambio, o NO
si no lo hace.
Si su destino de despliegue es anterior a iOS 6.0
Tendrá que cambiar la forma en que su transición está conectada en el guión gráfico y escribir un poco más de código.
En primer lugar, configure la transición desde el controlador de vista del botón al controlador de vista de destino, en lugar de directamente desde el botón al destino. Dé a segue un identificador como ValidationSucceeded
.
Luego, conecta el botón a una acción en su controlador de vista. En la acción, realice la validación y realice la transición o muestre una alerta según si la validación fue exitosa. Se verá algo como esto:
- (IBAction)performSegueIfValid:(id)sender {
if ([self validationIsSuccessful]) {
[self performSegueWithIdentifier:@"ValidationSucceeded" sender:self];
} else {
[self showAlertForValidationFailure];
}
}
Lo que funcionó para mí y lo que creo que es la respuesta correcta es utilizar el método UIViewController que se encuentra en la Guía del desarrollador de Apple :
shouldPerformSegueWithIdentifier: remitente:
Implementé mi método así:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if ([identifier isEqualToString:@"Identifier Of Segue Under Scrutiny"]) {
// perform your computation to determine whether segue should occur
BOOL segueShouldOccur = YES|NO; // you determine this
if (!segueShouldOccur) {
UIAlertView *notPermitted = [[UIAlertView alloc]
initWithTitle:@"Alert"
message:@"Segue not permitted (better message here)"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
// shows alert to user
[notPermitted show];
// prevent segue from occurring
return NO;
}
}
// by default perform the segue transition
return YES;
}
¡Trabajado como un encanto!
Actualizado con Swift para> = iOS 8 :
override func shouldPerformSegueWithIdentifier(identifier: String!, sender: AnyObject!) -> Bool {
if identifier == "Identifier Of Segue Under Scrutiny" {
// perform your computation to determine whether segue should occur
let segueShouldOccur = true || false // you determine this
if !segueShouldOccur {
let notPermitted = UIAlertView(title: "Alert", message: "Segue not permitted (better message here)", delegate: nil, cancelButtonTitle: "OK")
// shows alert to user
notPermitted.show()
// prevent segue from occurring
return false
}
}
// by default perform the segue transitio
return true
}
Te daré un ejemplo, aquí está mi código:
- (IBAction)Authentificate:(id)sender {
if([self WSAuthentification]){
[self performSegueWithIdentifier:@"authentificationSegue" sender:sender];
}
else
{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Authetification Failed" message:@"Please check your Identifications" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
[alert show];
}
Pero parece que eso no funciona, en todos los casos se realiza mi transición. La respuesta es fácil, tenemos que cablear la transición desde el controlador de vista no desde el botón.