J'ai un commun UIViewController
que tous mes UIViewsControllers
permettent de réutiliser certaines opérations courantes.
Je veux mettre en place une division sur ce "Common" UIViewController
afin que tous les autres UIViewControllers
héritent.
J'essaie de comprendre comment je fais cela par programme.
Je suppose que la question pourrait également être comment définir une segue
pour tous mes UIViewControllers
sans entrer dans le story-board et les faire à la main.
Par définition, une séquence ne peut pas exister indépendamment d'un storyboard. C'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:
dans le code de votre contrôleur de vue, mais cela dépend du fait qu'un segment a déjà été configuré dans le storyboard pour faire référence.
Ce que je pense que vous demandez, cependant, est de savoir comment vous pouvez créer une méthode dans votre contrôleur de vue commun (classe de base) qui passera à un nouveau contrôleur de vue et qui sera héritée par toutes les classes dérivées. Pour ce faire, vous pouvez créer une méthode comme celle-ci dans votre contrôleur de vue de classe:
- (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 vous cliquez sur le bouton approprié ou sélectionnez la ligne de la table, etc.
Je pensais que j'ajouterais une autre possibilité. Une des choses que vous pouvez faire est de pouvoir connecter deux scènes dans un storyboard en utilisant une séquence qui n'est pas attachée à une action, puis de déclencher par programmation la séquence dans votre contrôleur de vue. Pour ce faire, vous devez faire glisser l'icône de propriétaire du fichier située au bas de la scène du scénarimage, à savoir la scène en séquence, puis faites-la glisser jusqu'à la scène de destination. Je vais jeter une image pour aider à expliquer.
Une fenêtre contextuelle s'affichera pour "Manuel Segue". J'ai choisi Push comme type. Tapez sur le petit carré et assurez-vous que vous êtes dans l'inspecteur d'attributs. Donnez-lui un identifiant que vous utiliserez pour vous y référer en code.
Ok, je vais ensuite utiliser un élément de bouton de barre programmatique. Dans viewDidLoad ou ailleurs, je vais créer un élément de bouton 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, remarquez que le sélecteur est buttonizeButtonTap :. Donc, écrivez une méthode void pour ce bouton et dans cette méthode, vous appellerez la segue comme ceci:
-(void)buttonizeButtonTap:(id)sender{
[self performSegueWithIdentifier:@"Associate" sender:sender];
}
Le paramètre sender est requis pour identifier le bouton lors de l'appel de prepareForSegue. prepareForSegue est la méthode-cadre permettant d'instancier votre scène et de lui transmettre les valeurs nécessaires à son travail. Voici à quoi ressemble ma méthode:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"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 ça vous aide.
J'utilise ce code pour instancier ma sous-classe segue personnalisée et l'exécuter par programme. Cela semble fonctionner. Quelque chose ne va pas avec ça? Je suis perplexe en lisant toutes les autres réponses en disant que cela ne peut ê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 répond et est 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ésentais une vue de connexion en tant que premier écran, puis je voulais passer à l'application si les informations de connexion étaient correctes. J'ai créé le passage du contrôleur login-view au contrôleur de vue racine et lui ai donné un identifiant du type "myidentifier".
Ensuite, après avoir vérifié tout le code de connexion si la connexion était correcte, j'appellerais
[self performSegueWithIdentifier: @"myidentifier" sender: self];
Mon plus grand malentendu a été d’essayer de placer la transition sur un bouton et de l’interrompre une fois qu’elle a été trouvée.
Vous devez associer votre code à la UIStoryboard
que vous utilisez. Assurez-vous d’entrer YourViewController dans votre UIStoryboard
, cliquez sur la bordure qui l’entoure, puis réglez son champ identifier
sur un NSString
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 contrôleurs qui sont dans le storyboard.
jhilgert00 est-ce ce que vous recherchiez?
-(IBAction)nav_goHome:(id)sender {
UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
[self.navigationController pushViewController: myController animated:YES];
}
OU...
[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
Les légendes de storyboard ne doivent pas être créées en dehors du storyboard. Vous aurez besoin de le câbler, malgré les inconvénients.
Référence UIStoryboardSegue indique clairement:
Vous ne créez pas directement d'objets Segue. Au lieu de cela, l'exécution du storyboard les crée lorsqu'elle doit effectuer une transition entre deux contrôleurs de vue. Vous pouvez toujours lancer une séquence à l'aide de la méthode performSegueWithIdentifier: sender: de UIViewController si vous le souhaitez. Vous pouvez le faire pour lancer une séquence à partir d'une source ajoutée par programme et donc non disponible dans Interface Builder.
Vous pouvez toujours indiquer par programme au storyboard de présenter un contrôleur de vue à l'aide d'une séquence utilisant des appels presentModalViewController:
ou pushViewController:animated:
, mais vous aurez besoin d'une instance de storyboard.
Vous pouvez appeler la méthode de classe UIStoryboard
s pour obtenir un storyboard nommé avec bundle nil pour le bundle principal.
storyboardWithName:bundle:
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 wwdc 2011 présentant StoryBoard. sa disponible sur youtube également.
J'aimerais ajouter une précision ...
Un malentendu courant, en fait, que j'avais depuis quelque temps, est qu'une transition de story-board est déclenchée par la méthode prepareForSegue:sender:
. Ce n'est pas. Une séquence de storyboard sera exécutée, que vous ayez ou non implémenté une méthode prepareForSegue:sender:
pour ce contrôleur de vue (différent de).
J'ai appris cela de l'excellent travail de Paul Hegarty conférences iTunes . Je m'excuse mais je ne sais malheureusement pas 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 méthode prepareForSegue:sender:
, la séquence restera toujours associée au contrôleur de vue cible. Cependant, il se séparera de ce contrôleur de vue 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 à l'aide du fichier de classe et de l'identifiant 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 dans l'éditeur> Intégrer dans> Contrôleur de navigation.
3) Dans votre premier cours, importez le "secondClass.h"
#import "ViewController.h
#import "secondController.h"
4) Ajoutez cette commande dans IBAction qui doit effectuer la séquence
secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
[self.navigationController pushViewController:next animated:YES];
5) @"second"
est une classe de contrôleur secondview, id du storyboard.
J'ai inversé l'ingénierie et fait une (re) mise en œuvre open source des séquences d'UUtoryboard: 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.
Voici l'exemple de code pour 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()
}
...
}
Quelques problèmes, en fait:
Premièrement, dans le projet que vous avez chargé pour nous, la segue ne porte pas l'identifiant "segue1":
pas d'identifiant
Vous devez renseigner cet identifiant si vous ne l'avez pas déjà fait.
Deuxièmement, lorsque vous passez d'une vue à une autre, vous appelez initWithNibName pour créer un contrôleur de vue. Vous voulez vraiment utiliser instantiateViewControllerWithIdentifier.