78 votes

Utilisation de plusieurs scénarimages dans iOS

Mon objectif est de créer des onglets de l'application, puis la vue pour chacun des onglets sont construits dans distinct, des story-boards.

Storyboard screenshot

Mon mainstoryboard est un onglet de la vue.

Puis-je créer un secondaire scénarimage (storyboard#2) avec 2 Contrôleurs de Vue. La première-vue-contrôleur (également cochées initiale) ont un bouton, et des enchaînements (modal) 2ème de la vue. First view controller

J'ai réussi à charger la vue en sous-classement et dominante loadView du storyboard#2. loadView override

Voici le simulateur de sortie.

Simulator

Lors d'un clic sur le bouton "click me", j'obtiens un EXC_BAD_ACCESS. La séquence ne fonctionne pas, il semble que la deuxième storyboard n'est pas complètement chargé.

Quelqu'un a déjà essayé de le faire avant et le faire fonctionner? Il y a une vidéo youtube à partir de SkillMaster.net mais il ne démontre pas, si une séquence est de travailler à titre secondaire, en storyboard. la vidéo est ici: http://youtu.be/D4_twoYvB4M

Merci pour toute contribution et de l'aide!

Captures d'écran:

82voto

Rhubarb Points 16453

Ce sont les meilleurs articles que j'ai vu sur plusieurs story-boards.

Non seulement ce mec vous dire comment créer un nouveau storyboard dans le code, il

  • recommande plusieurs story-boards dans la pratique (plus de code modulaire)
  • explique quand à l'utilisation xibs vs story-boards (xibs avoir des vues, storboards sont basés sur les contrôleurs)
  • fournit une classe pour relier les storyboards avec enchaîne sur github

Notez que ce dernier point est important parce que la clé de la baisse de plusieurs story-boards, c'est que vous pouvez généralement pas de lien avec enchaîne, mais prive de la bibliothèque permet qu'avec un peu de fausser

Voir aussi l'discuté ici

44voto

pchap10k Points 1648

Cette question duplique celle-ci iOS 5 en chargeant un autre Storyboard

Le PO a modifié sa question pour y inclure la réponse:

 UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"HelpStoryboard" bundle:nil];
UIViewController* initialHelpView = [storyboard instantiateInitialViewController];

initialHelpView.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:initialHelpView animated:YES];
 

Bien sûr, l’appel d’origine est significatif, car vous pourriez avoir 2 story-boards et leur pile de vues en mémoire. Il est donc probablement préférable que vous appeliez ce code de l'extérieur des contrôleurs de vue de l'autre storyboard.

19voto

vokilam Points 4257

J'ai examiné les RBStoryboardLink approche proposée par la Rhubarbe. Cette mise en œuvre des substituts de vue du contrôleur de propriétés qui semble étrange. Je crois que j'ai trouvé la façon de l'éviter. Voici le projet de démonstration.

Les contrôleurs de la Navigation

Les contrôleurs de la Navigation pourriez tout simplement une vue référencée contrôleur en tant que racine. La mise en œuvre de ce point de vue contrôleur peut ressembler à ceci:

@interface ExternNavigationController : UINavigationController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternNavigationController

- (void)awakeFromNib
{
    NSAssert(self.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:self.storyboardName bundle:nil];
    UIViewController *vc = self.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:self.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    self.viewControllers = @[vc];
}

@end

Afficher les contrôleurs

Les problèmes commencent lorsque vous souhaitez faire un view controller défini dans un storyboard. C'est le cas lorsque les propriétés sont copiés. Au lieu de cela, nous pouvons mettre en œuvre une coutume des enchaînements qui va remplacer par un faux contrôleur de destination avec un vrai externes dans le storyboard.

@interface ExternStoryboardSegue : UIStoryboardSegue

@end

@implementation ExternStoryboardSegue

- (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(ExternViewController *)destination
{
    NSAssert(destination.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:destination.storyboardName bundle:nil];
    UIViewController *vc = destination.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:destination.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    return [super initWithIdentifier:identifier source:source destination:vc];
}

- (void)perform
{
    [[self.sourceViewController navigationController] pushViewController:self.destinationViewController animated:YES];
}

@end

ExternViewController est utilisé comme un espace réservé et contient requis pour la substitution des propriétés (storyboardName et sceneIdentifier).

@interface ExternViewController : UIViewController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternViewController

@end

Nous avons besoin de définir ces propriétés et la classe personnalisée pour l'espace réservé-vue-contrôleur. Et aussi le lien de vue-contrôleur avec ExternStoryboardSegue.

IB screenshot

16voto

Joachim H. Skeie Points 1400

Depuis l'un de mes fichiers XIB, je navigue dans une partie plus compliquée de l'interface graphique et j'utilise un Storyboard pour cette partie. Donc, un bouton de mon XIB ira au storyboard. Le code que j'ai pour cela est:

 UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardIdentifier" bundle:nil];
UIViewController* myStoryBoardInitialViewController = [storyboard instantiateInitialViewController];

[self.navigationController pushViewController:myStoryBoardInitialViewController animated:YES];
 

Cela va réussir à pousser mon StoryBoard sur la vue. Le code ci-dessus est appelé à partir d’une action "Retoucher l’intérieur".

7voto

Tim Kemp Points 3515

Apple docs disent que vous pouvez avoir plusieurs story-boards. Malheureusement, ils ne vont pas dans les détails sur la façon de le faire. Comme vous l'avez constaté, Interface Builder ne vous aidera pas, de sorte que vous aurez à faire dans le code. Il fonctionne un peu comme le chargement XIBs:

[UIStoryboard storyboardWithName:@"MyNewStoryboard" bundle:myBundle]

Cela dit, si vous ne "voulez un gros bouffi storyboard" comme vous le dites dans votre commentaire puis XIBs sont vraiment la voie à suivre. Que la "grandeur" est l'avantage: tous les transitions entre les VCs sont disposés dans un seul endroit. Le fait d'avoir plusieurs story-boards est vraiment de sorte que vous pouvez prendre en charge de multiples différents et sans rapport avec les flux par le biais de votre application: par exemple, un storyboard pour une configuration complexe de flux et un autre pour l'utilisateur principal de l'écoulement.

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