En utilisant des storyboards iOS 5, sur un bouton j'effectue une séquence, ce que je veux, c'est faire la validation sur mon champ de texte et si la validation échoue, je dois arrêter la séquence et lancer une alerte. Quelle est la façon de procéder?
Vous pouvez simplement implémenter le shouldPerformSegueWithIdentifier:sender:
méthode sur votre contrôleur de vue source. Faites que cette méthode retourne YES
si vous voulez effectuer la transition, ou NO
si vous ne le faites pas.
Vous devrez changer la façon dont votre séquence est connectée dans le storyboard et écrire un peu plus de code.
Tout d'abord, configurez la séquence depuis le contrôleur de vue du bouton vers le contrôleur de vue de destination, au lieu de directement du bouton vers la destination. Donnez à la séquence un identifiant comme ValidationSucceeded
.
Ensuite, connectez le bouton à une action sur son contrôleur de vue. Dans l'action, effectuez la validation et effectuez la transition ou affichez une alerte selon que la validation a réussi. Cela ressemblera à ceci:
- (IBAction)performSegueIfValid:(id)sender {
if ([self validationIsSuccessful]) {
[self performSegueWithIdentifier:@"ValidationSucceeded" sender:self];
} else {
[self showAlertForValidationFailure];
}
}
Ce qui a fonctionné pour moi et ce que je pense être la bonne réponse est d'utiliser la méthode UIViewController trouvée dans Apple Developer Guide :
shouldPerformSegueWithIdentifier: sender:
J'ai implémenté ma méthode comme ceci:
- (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;
}
A fonctionné comme un charme!
Mis à jour avec Swift pour> = 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
}
Je vais vous donner un exemple, voici mon code:
- (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];
}
Mais il semble que cela ne fonctionne pas, dans tous les cas, mon enchaînement est effectué. La réponse est simple, nous devons câbler la séquence depuis le contrôleur de vue lui-même et non depuis le bouton.