Par définition, une séquence ne peut pas vraiment exister indépendamment d'un storyboard. Il est même là au nom de la classe: UIStoryboardSegue
. Vous ne créez pas de séquences par programmation - c'est le runtime du storyboard qui les crée pour vous. Vous pouvez normalement appeler performSegueWithIdentifier:
le code de votre contrôleur de vue, mais cela repose sur le fait d'avoir une séquence déjà configurée dans le storyboard pour référence.
Je pense cependant que vous demandez comment créer une méthode dans votre contrôleur de vue commun (classe de base) qui passera à un nouveau contrôleur de vue et sera héritée par toutes les classes dérivées. Vous pouvez le faire en créant une méthode comme celle-ci sur votre contrôleur de vue de classe de base:
- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
// do any setup you need for myNewVC
[self presentModalViewController:myNewVC animated:YES];
}
puis dans votre classe dérivée, appelez cette méthode lorsque le bouton approprié est cliqué ou que la ligne du tableau est sélectionnée ou autre.
UIViewController
méthode nomméeperformSegueWithIdentifier:sender:
pour cela.UIView
-cipresentModalViewController:animated:
est déconseillée. De la documentation - (obsolète dans iOS 6.0. Utilisez presentViewController: animated: complétion: à la place.)J'ai pensé ajouter une autre possibilité. L'une des choses que vous pouvez faire est de connecter deux scènes dans un storyboard à l'aide d'une séquence qui n'est pas attachée à une action, puis de déclencher la séquence par programmation dans votre contrôleur de vue. Pour ce faire, vous devez faire glisser depuis l'icône du propriétaire du fichier en bas de la scène du storyboard qui est la scène de transition, et faire glisser vers la droite vers la scène de destination. Je vais jeter une image pour aider à expliquer.
Une fenêtre apparaîtra pour "Manual Segue". J'ai choisi Push comme type. Appuyez sur le petit carré et assurez-vous que vous êtes dans l'inspecteur d'attributs. Donnez-lui un identifiant que vous utiliserez pour y faire référence dans le code.
Ok, je vais ensuite utiliser un élément de bouton de barre de programmation. Dans viewDidLoad ou ailleurs, je vais créer un élément de bouton dans la barre de navigation avec ce code:
Ok, notez que le sélecteur est buttonizeButtonTap :. Donc, écrivez une méthode void pour ce bouton et dans cette méthode, vous appellerez la séquence comme ceci:
Le paramètre sender est requis pour identifier le bouton lorsque prepareForSegue est appelé. prepareForSegue est la méthode de framework où vous allez instancier votre scène et lui passer toutes les valeurs dont elle aura besoin pour faire son travail. Voici à quoi ressemble ma méthode:
Ok, viens de le tester et ça marche. J'espère que cela vous aide.
la source
J'ai utilisé ce code pour instancier ma sous-classe de séquence personnalisée et l'exécuter par programme. 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.
la source
UIStoryboardSegue
.performSegueWithIdentifier:
est vraiment défini dans le storyboard. J'évite tous les problèmes si je crée moi-même la séquence.Je suppose que c'est répondu et accepté, mais je voudrais juste ajouter quelques détails supplémentaires.
Ce que j'ai fait pour résoudre un problème où je présenterais une vue de connexion comme premier écran et que je voulais ensuite accéder à l'application si la connexion était correcte. J'ai créé la séquence à partir du contrôleur de connexion-vue vers le contrôleur de vue racine et lui ai donné un identifiant comme "myidentifier".
Ensuite, après avoir vérifié tous les codes de connexion si la connexion était correcte, j'appellerais
Mon plus grand malentendu était que j'ai essayé de mettre la séquence sur un bouton et d'interrompre la séquence une fois qu'elle a été trouvée.
la source
Vous devez lier votre code à celui
UIStoryboard
que vous utilisez. Assurez-vous d'entrer dans YourViewController dans votreUIStoryboard
, cliquez sur la bordure qui l'entoure, puis définissez sonidentifier
champ sur unNSString
que vous appelez dans votre code.la source
Pour les contrôleurs qui sont dans le storyboard.
jhilgert00 est-ce ce que vous cherchez?
OU...
la source
Eh bien, vous pouvez créer et également sous-classer UIStoryBoardSegue. le sous-classement est principalement utilisé pour donner une animation de transition personnalisée.
vous pouvez voir la vidéo de la wwdc 2011 présentant StoryBoard. son disponible sur youtube également.
http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue
la source
Je voudrais ajouter une précision ...
Un malentendu commun, en fait que j'ai eu pendant un certain temps, est qu'une séquence de storyboard est déclenchée par la
prepareForSegue:sender:
méthode. Ce n'est pas. Une séquence de storyboard sera exécutée, que vous ayez ou non implémenté uneprepareForSegue:sender:
méthode pour ce contrôleur de vue (en partant).J'ai appris cela des excellentes conférences iTunesU de Paul Hegarty . Mes excuses, mais je ne me souviens malheureusement pas de quelle conférence.
Si vous connectez une séquence entre deux contrôleurs de vue dans un storyboard, mais que vous n'implémentez pas de
prepareForSegue:sender:
méthode, la séquence se connecte toujours au contrôleur de vue cible. Il se connecte cependant à ce contrôleur de vue sans préparation.J'espère que cela t'aides.
la source
Les séquences de storyboard ne doivent pas être créées en dehors du storyboard. Vous devrez le câbler, malgré les inconvénients.
La référence UIStoryboardSegue indique clairement:
Vous pouvez toujours demander par programmation au storyboard de présenter un contrôleur de vue à l'aide d'une séquence de transition
presentModalViewController:
ou d'pushViewController:animated:
appels, mais vous aurez besoin d'une instance de storyboard.Vous pouvez appeler la
UIStoryboard
méthode de classe s pour obtenir un storyboard nommé avec bundle nil pour le bundle principal.storyboardWithName:bundle:
la source
Tout d'abord, supposons que vous ayez deux vues différentes dans le storyboard et que vous souhaitiez naviguer d'un écran à un autre, procédez comme suit:
1). Définissez toutes vos vues avec le fichier de classe et également l'ID du storyboard dans l'inspecteur d'identité.
2). Assurez-vous d'ajouter un contrôleur de navigation à la première vue. Sélectionnez-le dans le Storyboard puis Editeur> Incorporer dans> Contrôleur de navigation
3). Dans votre première classe, importez le "secondClass.h"
4). Ajoutez cette commande dans l'IBAction qui doit effectuer la séquence
5).
@"second"
est la classe du contrôleur secondview, id du storyboard.la source
self.storyboard
devrait être:UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
storyboardWithName:@"Main"
[self showDetailViewController:next sender:self];
ou[self showViewController:next sender:self];
J'ai procédé à une ingénierie inverse et effectué une (ré) implémentation open source des séquences d'UIStoryboard: https://github.com/acoomans/Segway
Avec cette bibliothèque, vous pouvez définir des séquences par programmation (sans aucun storyboard).
J'espère que cela peut aider.
la source
Quelques problèmes, en fait:
Tout d'abord, dans ce projet que vous avez téléchargé pour nous, la séquence 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 d'une vue de table à une vue de table, vous appelez initWithNibName pour créer un contrôleur de vue. Vous voulez vraiment utiliser instantiateViewControllerWithIdentifier.
la source
Voici l'exemple de code pour
Creating a segue programmatically
:la source
self.prepare(for: self.commonSegue, sender: self)
partir de votre méthode d'action. Quel est alors l'intérêt de comparerif self.commonSegue == segue {...}
dans laprepare(for:sender)
méthode?prepare(for:sender:)
, vous pouvez configurer le contrôleur de vue de destination avant qu'il ne soit affiché. Bien sûr, vous pouvez également le faire enactionFunction
.