Dans les écrans complexes (Contrôleurs de vue), je séparais le tout en petits morceaux (je les appelle des widgets). Ces widgets consistent essentiellement en un MyWidget.h
et un MyWidget.m
fichier ainsi qu'un fichier MyWidget.xib
fichier, où l'élément racine est un UIView
et la classe MyWidget est le propriétaire du fichier de UIView. Dans l'init de ce widget je fais un loadNibNamed
.
Dans mon View Controller, je fais ensuite un [[MyWidget alloc] init]
, que j'ajoute à la vue principale du contrôleur de View en tant que vue secondaire. Ceci, jusqu'à présent, fonctionne parfaitement.
Je me demande maintenant comment faire la même chose avec le scénarimage, car je ne peux pas vraiment commencer à faire glisser un UIView
quelque part, je dois toujours commencer par un UIViewController
, ce que je ne fais pas vouloir.
S'il n'y a aucune possibilité de faire cela avec un Storyboard, puis-je simplement le faire à l'ancienne, en utilisant le Storyboard pour mes écrans principaux et mes séquences, et en utilisant un fichier .xib séparé pour définir des vues personnalisées?
Le fait de placer le widget/la vue dans un fichier .xib distinct fonctionne et convient particulièrement si vous souhaitez référencer cette même vue à partir de plusieurs contrôleurs de vue.
Cependant, vous souhaitez parfois voir la vue/le widget supplémentaire dans le même scénario, et c'est possible. Voici comment vous le faites:
Sélectionnez votre contrôleur de vue dans IB (cliquez sur la barre noire sous la vue), puis faites glisser une vue UIView de la bibliothèque d'objets vers la barre noire:
Lorsqu'une vue se trouve dans la barre noire, elle est instanciée comme toute autre vue dans IB, mais elle n'est simplement pas ajoutée à votre hiérarchie de vues tant que vous ne le faites pas dans le code. Changez la classe de la vue pour qu'elle corresponde à votre propre sous-classe, si nécessaire:
Vous pouvez le connecter à votre contrôleur de vue comme vous le feriez avec n'importe quelle autre vue:
La vue ajoutée apparaît dans votre plan de document et vous pouvez également y associer des actions et des références:
Maintenant, le problème qui reste est que vous ne pouvez pas voir la vue, peu importe le nombre de fois que vous essayez de cliquer ou de double-cliquer, ce qui irait à l'encontre de l'objectif de la placer dans le même story-board. Heureusement, je connais deux solutions de contournement.
La première solution consiste à faire glisser la vue de la barre noire dans la vue de votre contrôleur de vue, à la modifier, puis à la faire glisser dans la barre noire une fois que vous avez terminé. C'est gênant mais fiable.
L'autre solution de contournement est plus complexe, mais je la préfère car elle me permet de voir tous mes points de vue en même temps:
Ensuite, faites glisser un UITableViewCell dans ce UITableView.
Une fois que vous avez fait cela, votre vue apparaît comme par magie, mais vous avez une UITableView que vous ne voulez pas. Vous pouvez soit le redimensionner à 0x0, soit le supprimer et votre UIView restera (généralement) toujours visible.
La deuxième méthode fonctionne pour UIViews mais pas très bien pour UIToolbars et est impossible pour les boutons UIB. La solution la plus propre que j'ai trouvée lorsque vous devez inclure de nombreuses sous-vues différentes consiste à attacher un seul UIView secondaire à votre contrôleur de vue en tant que conteneur: ne sont jamais affichés, mettez toutes vos vues secondaires ici et utilisez l’astuce UITableViewCell pour tout afficher. Je redimensionne mon factice UITableView à 0x0 pour le rendre invisible. Voici une capture d'écran de la façon dont tout cela ressemble:
Si vous cherchez simplement à faire en sorte que vos contrôleurs de vue soient ailleurs (et pas dans votre story-board), il existe un moyen simple de le faire:
1) Créez vos CustomViewController
s (abcdController
dans le code que j'ai essayé) avec leurs individus xib
comme d'habitude.
2) Ajoutez un UIViewController
(ou quelle que soit la superclasse de votre CustomViewController
) au story-board.
3) Définissez CustomClass sur CustomViewController
au lieu de UIViewController
comme indiqué ici:
4) Enfin, dans votre viewDidLoad
, chargez la coutume xib
et vous avez terminé.
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
// Do any additional setup after loading the view from its nib.
}
Je pense que vous pouvez faire quelque chose comme ceci pour obtenir une instance d'un contrôleur de vue spécifique à partir de Storyboard et utiliser la vue par dessus.
ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.
J'espère que cela t'aides
Merci Vijay