39 votes

Pour arrêter la transition et montrer l'alerte

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 ?

77voto

rob mayoff Points 124153

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];
    }
}

38voto

Shaun Points 475

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
}

0voto

Ali Points 155

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X