46 votes

Comment faire pour "annuler" un UIStoryBoardSegue

Personne ne sait comment "arrêter" une séquence de transition conditionnelle:

Ma table vue cellules représentent les produits qui peuvent être affichés dans un forage "détail" de la vue... ou pas! (Cela dépend de plusieurs choses)

Maintenant, mon App considère tous les produits de "débloquer":

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
    ListaProdottiController *prodottiViewController = [segue destinationViewController];
    prodottiViewController.blocco = [self.fetchedResultsController objectAtIndexPath:selectedRowIndex];
}

Comment puis-je annuler la sélection d'une ligne => exploration, à ce point?

82voto

Joshcodes Points 1411

Si vous utilisez iOS 6 ou plus, ma connaissance de la façon la plus propre de le faire est le suivant:

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if([identifier isEqualToString:@"show"])
    {
        NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
        Blocco *blocco = [self.fetchedResultsController objectAtIndexPath:selectedRowIndex];
        return [blocco meetRequiredConditions];
    }
    return YES;
}

Où il y a une méthode

-(BOOL) meetsRequiredConditions;

Défini sur votre Blocco classe renvoie OUI si le "couple" des choses qui permettent une exploration sont valides.

32voto

igbopie Points 459

Je ne sais pas si c'est la bonne façon de le faire, mais j'ai découvert une solution de contournement.

À partir de la table de montage séquentiel j'ai associé(ctrl+clic) une séquence à partir de la barre d'état en-vue-contrôleur. Donner la séquence d'un IDENTIFIANT (par exemple: switchSegue).

Maintenant, à partir d'une action dans votre code (dans mon code j'utilise un bouton), je l'appelle:

 [self performSegueWithIdentifier:@"switchSegue" sender:sender];

De cette façon, vous pouvez contrôler si votre séquence est effectuée ou non. Essayez de tutoriels qui m'ont permis de partir d' ici et ici

Espérons que cette aide.

18voto

zirinisp Points 984

Je suis en utilisant un beaucoup plus facile et bien rangé approche.

Storyboard

  1. Créer deux identiques cellule avec des identifiants différents. Par exemple: "cellWithSegue" et "cellWithoutSegue".
  2. Connecter la première cellule ("cellWithSegue") avec la séquence que vous souhaitez afficher.
  3. Ne pas connecter la deuxième cellule, avec tout enchaîner.

La Vue De La Table

  1. Sur cellForRowAtIndexPath, de mettre en œuvre une logique pour déterminer si la cellule doit être lié à un segue ou pas.
  2. Pour les cellules qui doivent être liés avec la séquence d'utiliser le "cellWithSegue" identifiant, pour le reste, le "cellWithoutSegue".

De cette façon, semble beaucoup plus facile à mettre en œuvre et également de ne pas modifier la façon dont enchaîne sont censés travailler.

14voto

SomaMan Points 2215

J'ai peut-être faux, mais après avoir lutté me présente, j'ai juste désactivé la cellule de l'interaction de l'utilisateur sur les cellules où je ne voulais pas le seque déclenché (en cellForRowAtIndexPath:). Semble fonctionner parfaitement, et il est à seulement 1 ligne de code!

cell.userInteractionEnabled = NO;

11voto

Johnson Mathew Points 127

La solution la plus simple est de créer manuel de transition dans l'histoire du conseil et de l'utiliser comme vu ci-dessous.

[auto performSegueWithIdentifier:@"loginSuccessSegue" expéditeur:self];


Ou


@Fabio: j'ai essayé de trouver une solution pour le même type de cas d'utilisation et j'ai presque trouvé une solution.

Cas d'utilisation 1. Arrêter la séquence de transition conditionnelle 2. Changement de destination viewController conditionnellement

Solution:

Utiliser "Personnalisé" segue. Suivez les étapes ci-dessous pour créer des enchaînements 1. Créer une sous-classe de UIStoryboardSegue "MyCustomSegue.h"

@interface MyCustomSegue : UIStoryboardSegue
@end

"MyCustomSegue.m"

Remplacer initWithIdentifier pour la mise en œuvre de cas d'utilisation 1 et 2 Si vous retourner nil, segue sera annulée/aucune action ne sera prise Vous instanciez votre ViewController et d'en faire une destination. Vous pouvez définir la destination que votre ancien fichier xib aussi.. que le code est commenté, mais j'ai veillé à ce que sera le travail.

@implementation MyCustomSegue
- (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination{

    UIStoryboard *storyBoard= [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];

    UIViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"testIdentifier"];

    // MyViewController* viewController= [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];
    return [super initWithIdentifier:identifier source:source destination:viewController];
}
  1. Vous devez remplacer "exécuter".

Vous pouvez mettre en œuvre de cas d'utilisation 1 ici aussi..

- (void)perform {
    // if either source or destination is nil, stop
    if (nil == self.sourceViewController || nil == self.destinationViewController) return;
    // return; //No Action. Segue will be cancelled
    UINavigationController *ctrl = [self.sourceViewController navigationController];
    [ctrl
     pushViewController:self.destinationViewController
     animated:YES];
}

Espérons que cette aide. Plz écrire si vous n'êtes pas clair.

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