web-dev-qa-db-fra.com

Pour arrêter la séquence et afficher l'alerte

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?

39
Firdous

Si votre cible de déploiement est iOS 6.0 ou version ultérieure

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.

Si votre cible de déploiement est antérieure à iOS 6.0

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];
    }
}
77
rob mayoff

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
}
38
Shaun

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.

0
Ali