J'utilise les storyboards d'iOS 5, sur un bouton j'exécute une séquence, ce que je veux c'est faire une validation sur mon champ texte et si la validation échoue je dois arrêter la séquence et lancer une alerte. Quelle est la façon de le faire ?
Réponses
Trop de publicités?Si votre cible de déploiement est iOS 6.0 ou une version ultérieure
Vous pouvez simplement implémenter la shouldPerformSegueWithIdentifier:sender:
sur votre contrôleur de vue source. Faites en sorte que cette méthode renvoie YES
si vous voulez effectuer la transition, ou NO
si vous ne le faites pas.
Si votre cible de déploiement est antérieure à iOS 6.0
Vous devrez modifier la façon dont votre segue est connectée dans le storyboard et écrire un peu plus de code.
Tout d'abord, configurez la transition entre le contrôleur de vue du bouton et le contrôleur de vue de la destination, au lieu de passer directement du bouton à la destination. Donnez à la transition 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 en fonction de la réussite de la validation. Cela ressemblera à quelque chose comme 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 crois être la bonne réponse est d'utiliser la méthode UIViewController qui se trouve dans le fichier Guide du développeur Apple :
shouldPerformSegueWithIdentifier:sender :
J'ai appliqué ma méthode comme suit :
- (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 a marché comme un charme !
Mise à 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, ma séquence est exécutée. 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.