257 votes

Empêcher segue dans la méthode prepareForSegue?

Est-il possible d’annuler une segue dans la `` méthode ?

Je veux effectuer une vérification avant la segue, et si la condition n’est pas vraie (dans ce cas, si certains `` est vide), afficher un message d’erreur au lieu d’exécuter la segue.

497voto

Abraham Points 1922

Dans iOS 6 et plus tard, sa possible: Vous devez mettre en œuvre la méthode

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

dans votre vue-contrôleur. Vous faites de votre validation de là, et si c'est OK alors return YES; si ce n'est pas l' return NO; et le prepareForSegue est de ne pas appeler.

Notez que cette méthode n'est pas appelée automatiquement lors du déclenchement enchaîne par programme, si vous avez besoin pour effectuer la vérification, alors vous devez appeler shouldPerformSegueWithIdentifier pour déterminer s'il convient d'effectuer des enchaînements.

53voto

esker Points 6266

Remarque: la accepté de répondre est la meilleure approche si vous pouvez cibler iOS 6. Pour le ciblage de l'iOS 5, cette réponse ne.

Je ne crois pas qu'il est possible d'annuler un segue en prepareForSegue. Je suggère de déplacer votre logique, au point que l' performSegue message est d'abord envoyé.

Si vous utilisez l'Interface Builder pour câbler un enchaîner directement à un contrôle (par exemple de relier un enchaîner directement à un UIButton), alors vous pouvez accomplir cela avec un peu de refactoring. Fil de la séquence à la vue du contrôleur, au lieu d'un contrôle spécifique (supprimer l'ancien segue lien, puis glisser à partir de la vue du contrôleur lui-même à la destination-vue-contrôleur). Puis de créer un IBAction de votre point de vue contrôleur de fil et le contrôle de la IBAction. Ensuite, vous pouvez faire votre logique (case vide TextField) dans le IBAction vous venez de créer, et de décider si ou de ne pas performSegueWithIdentifier par programmation.

12voto

Kaolin Fire Points 1102

Alternativement, il est un peu mauvais comportement à offrir à un utilisateur ne doit pas appuyer sur un bouton. Vous pouvez laisser la segue filaire que se tient, mais commencez par le bouton désactivé. Fil puis « editingChanged » de la UITextField à un événement sur l’ala de contrôle de vue

4voto

James Moore Points 174

Semblable à du Kaolin de réponse est de laisser le seque câble de contrôle pour valider le contrôle basé sur les conditions dans la vue. Si vous êtes de cuisson sur la table de l'interaction des cellules, alors vous devez également définir la userInteractionEnabled de la propriété ainsi que la désactivation de la substance dans la cellule.

Par exemple, j'ai un formulaire dans un groupe de la vue de la table. L'une des cellules conduit à une autre tableView qui agit comme un sélecteur. Chaque fois qu'un contrôle est modifiée dans la vue principale j'appelle cette méthode

-(void)validateFilterPicker
{
    if (micSwitch.on)
    {
        filterPickerCell.textLabel.enabled = YES;
        filterPickerCell.detailTextLabel.enabled = YES;
        filterPickerCell.userInteractionEnabled = YES;
        filterPickerCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    else
    {
        filterPickerCell.textLabel.enabled = NO;
        filterPickerCell.detailTextLabel.enabled = NO;
        filterPickerCell.userInteractionEnabled = NO;
        filterPickerCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

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