web-dev-qa-db-fra.com

Vues personnalisées avec Storyboard

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?

96
znq

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:

  1. 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:

    enter image description here

  2. 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:

    enter image description here

  3. Vous pouvez le connecter à votre contrôleur de vue comme vous le feriez avec n'importe quelle autre vue: enter image description here

  4. La vue ajoutée apparaît dans votre plan de document et vous pouvez également y associer des actions et des références:

    enter image description here


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:

  1. Faites glisser une UITableView de la bibliothèque d'objets vers la vue que vous venez d'ajouter.
  2. Ensuite, faites glisser un UITableViewCell dans ce UITableView.

    enter image description here

  3. 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.

  4. Parfois, la vue secondaire redevient masquée dans IB. Vous pouvez répéter les étapes ci-dessus si vous avez supprimé UITableView ou si UITableView est toujours dans la hiérarchie, il vous suffit de cliquer sur UITableViewCell pour que la vue réapparaisse.

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:

enter image description here

188
nioq

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:

enter image description here

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.
}
11
tipycalFlow

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

1
vijay_hrd