Création d'un segment par programmation

J'ai un UIViewController commun que tous mes UIViewsControllers étendent pour réutiliser quelques opérations communes.

Je veux mettre en place une section sur ce UIViewController "commun" de sorte que tous les autres UIViewControllers héritent.

J'essaie de comprendre comment je fais cela par programme.

Je suppose que la question pourrait aussi être de savoir comment créer une section pour tous mes UIViewControllers sans entrer dans le story-board et les faire à la main.

Par définition, une section ne peut pas exister indépendamment d'un storyboard. C'est même là au nom de la class: UIStoryboardSegue . Vous ne créez pas de segments par programme: c'est l'environnement d'exécution du storyboard qui les crée pour vous. Vous pouvez normalement appeler performSegueWithIdentifier: dans le code de votre controller de vue, mais cela dépend de la mise en place d'une section dans le storyboard pour reference.

Ce que je pense que vous requestz cependant est comment vous pouvez créer une méthode dans votre controller de vue commune (class de base) qui passera à un nouveau controller de vue, et sera héritée par toutes les classs dérivées. Vous pouvez le faire en créant une méthode comme celle-ci à votre controller de vue de class de base:

 - (IBAction)pushMyNewViewController { MyNewViewController *myNewVC = [[MyNewViewController alloc] init]; // do any setup you need for myNewVC [self presentModalViewController:myNewVC animated:YES]; } 

puis dans votre class dérivée, appelez cette méthode lorsque vous click le button approprié ou que vous select une ligne de table.

Je pensais que j'appendais une autre possibilité. Une des choses que vous pouvez faire est de pouvoir connecter deux scènes dans un storyboard en utilisant un segment qui n'est pas attaché à une action, puis de triggersr par programmation le segue dans votre controller de vue. La façon dont vous faites cela, c'est que vous devez faire glisser de l'icône du propriétaire du file au bas de la scène du storyboard qui est la scène d'enstringment, et faites glisser vers la scène de destination. Je vais jeter une image pour aider à expliquer.

entrez la description de l'image ici

Une window apparaîtra pour "Segue manuel". J'ai choisi Push comme le type. Appuyez sur le petit carré et assurez-vous que vous êtes dans l'inspecteur des attributes. Donnez-lui un identifiant que vous utiliserez pour vous y référer dans le code.

entrez la description de l'image ici

Ok, ensuite je vais utiliser un button de barre programmatique. Dans viewDidLoad ou ailleurs, je vais créer un élément de button dans la barre de navigation avec ce code:

 UIBarButtonItem *buttonizeButton = [[UIBarButtonItem alloc] initWithTitle:@"Buttonize" style:UIBarButtonItemStyleDone target:self action:@selector(buttonizeButtonTap:)]; self.navigationItem.rightBarButtonItems = @[buttonizeButton]; 

Ok, notez que le sélecteur est buttonizeButtonTap :. Donc, écrivez une méthode vide pour ce button et dans cette méthode, vous appellerez le segue comme ceci:

 -(void)buttonizeButtonTap:(id)sender{ [self performSegueWithIdentifier:@"Associate" sender:sender]; } 

Le paramètre de l'expéditeur est requirejs pour identifier le button lorsque prepareForSegue est appelé. prepareForSegue est la méthode du framework où vous allez instancier votre scène et lui transmettre toutes les valeurs dont elle aura besoin pour faire son travail. Voici à quoi ressemble ma méthode:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToSsortingng:@"Associate"]) { TranslationQuizAssociateVC *translationQuizAssociateVC = [segue destinationViewController]; translationQuizAssociateVC.nodeID = self.nodeID; //--pass nodeID from ViewNodeViewController translationQuizAssociateVC.contentID = self.contentID; translationQuizAssociateVC.index = self.index; translationQuizAssociateVC.content = self.content; } } 

Ok, juste testé et ça marche. J'espère que cela vous aide.

J'ai utilisé ce code pour instancier ma sous-class de segue personnalisée et l'exécuter par programmation. Cela semble fonctionner. Quelque chose ne va pas avec ça? Je suis perplexe, lisant toutes les autres réponses disant que cela ne peut pas être fait.

 UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"]; MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController]; [self prepareForSegue:segue sender:sender]; [segue perform]; 

Je suppose que cela est répondu et accepté, mais je voudrais juste append quelques détails supplémentaires.

Ce que j'ai fait pour résoudre un problème où je présenterais une vue de connection en tant que premier écran et que je voulais ensuite passer à l'application si la connection était correcte. J'ai créé le segue à partir du controller de vue de connection au controller de vue racine et lui ai donné un identificateur comme "myidentifier".

Ensuite, après avoir vérifié tous les codes de connection si la connection était correcte, j'appellerais

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

Mon plus grand malentendu était que j'essayais de mettre le button sur un button et d'interrompre la séance une fois qu'on l'avait trouvée.

Vous devez lier votre code à l' UIStoryboard que vous utilisez. Assurez-vous d'aller dans YourViewController dans votre UIStoryboard , click la bordure qui l'entoure, puis définissez son champ d' identifier sur un NSSsortingng que vous appelez dans votre code.

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; YourViewController *yourViewController = (YourViewController *) [storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"]; [self.navigationController pushViewController:yourViewController animated:YES]; 

Pour les controllers qui sont dans le storyboard.

jhilgert00 est ce que vous cherchez?

 -(IBAction)nav_goHome:(id)sender { UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"]; [self.navigationController pushViewController: myController animated:YES]; } 

OU…

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

Eh bien, vous pouvez créer et peut également sous-classr le UIStoryBoardSegue. le sous-classment est principalement utilisé pour donner une animation de transition personnalisée.

vous pouvez voir la video de wwdc 2011 présentant StoryBoard. c'est disponible sur youtube aussi.

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue

Je voudrais append une précision …

Un malentendu courant, en fait celui que j'ai eu pendant un certain time, est qu'une prepareForSegue:sender: storyboard est déclenchée par la prepareForSegue:sender: Ce n'est pas. Une séquence de storyboard sera exécutée, que vous ayez implémenté une prepareForSegue:sender: pour ce controller de vue (en partant de).

J'ai appris cela à partir des excellentes conférences iTunesU de Paul Hegarty. Mes excuses, mais malheureusement, ne me souviens pas quelle conférence.

Si vous connectez une section entre deux controllers de vue dans un storyboard, mais que vous prepareForSegue:sender: pas une prepareForSegue:sender: toujours au controller de vue cible. Il faudra cependant se rendre à cette vue controller non préparé.

J'espère que cela t'aides.

Tout d'abord, supposons que vous ayez deux vues différentes dans le storyboard, et que vous souhaitiez naviguer d'un écran à l'autre, procédez comme suit:

1). Définissez toutes vos vues avec le file de class et l'ID du storyboard dans l'inspecteur d'identité.

2). Assurez-vous d'append un controller de navigation à la première vue. Sélectionnez-le dans le Storyboard, puis Editeur> Intégrer dans> Contrôleur de navigation

3). Dans votre première class, importez le "secondClass.h"

 #import "ViewController.h #import "secondController.h" 

4). Ajoutez cette command dans IBAction qui doit effectuer le segue

 secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"]; [self.navigationController pushViewController:next animated:YES]; 

5). @"second" est la class de controller secondview, id storyboard.

Les séquences de storyboard ne doivent pas être créées en dehors du storyboard. Vous devrez le câbler, malgré les inconvénients.

UIStoryboardSegue Reference indique clairement:

Vous ne créez pas d'objects de segue directement. Au lieu de cela, l'environnement d'exécution du storyboard les crée lorsqu'il doit effectuer une transition entre deux controllers de vue. Vous pouvez toujours lancer un segue par programmation en utilisant la méthode performSegueWithIdentifier: sender: de UIViewController si vous le souhaitez. Vous pouvez le faire pour lancer un segment à partir d'une source qui a été ajoutée par programmation et qui n'est donc pas disponible dans Interface Builder.

Vous pouvez toujours programmer le storyboard pour présenter un controller de vue à l'aide d'un segment en utilisant presentModalViewController: ou pushViewController:animated: calls, mais vous aurez besoin d'une instance de storyboard.

Vous pouvez appeler la méthode de class UIStoryboard pour get un storyboard nommé avec bundle nil pour le bundle principal.

storyboardWithName:bundle:

J'ai fait une ingénierie inverse et j'ai fait une (re) implémentation en open source des requêtes d'UIStoryboard: https://github.com/acoomans/Segway

Avec cette bibliothèque, vous pouvez définir des partitions par programme (sans storyboard).

J'espère que ça peut aider.

Un couple de problèmes, en fait:

Tout d'abord, dans ce projet que vous avez téléchargé pour nous, le segue ne porte pas l'identifiant "segue1":

pas d'identifiant

Vous devez remplir cet identifiant si vous ne l'avez pas déjà fait.

Deuxièmement, lorsque vous passez de l'affichage table à l'affichage tableau, vous appelez initWithNibName pour créer un controller de vue. Vous voulez vraiment utiliser instantiateViewControllerWithIdentifier.

Voici l'exemple de code pour la Creating a segue programmatically :

 class ViewController: UIViewController { ... // 1. Define the Segue private var commonSegue: UIStoryboardSegue! ... override func viewDidLoad() { ... // 2. Initialize the Segue self.commonSegue = UIStoryboardSegue(identifier: "CommonSegue", source: ..., destination: ...) { self.commonSegue.source.showDetailViewController(self.commonSegue.destination, sender: self) } ... } ... override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 4. Prepare to perform the Segue if self.commonSegue == segue { ... } ... } ... func actionFunction() { // 3. Perform the Segue self.prepare(for: self.commonSegue, sender: self) self.commonSegue.perform() } ... }