Quels sont les avantages d'utiliser Storyboards au lieu de fichiers xib dans la programmation iOS?
Quels sont les principales différences entre l'utilisation des story-boards et des fichiers xib.
spécifiquement, quels sont les avantages ou inconvénients de l'utilisation d'un Storyboard?
malheureusement, malgré quelques recherches, tout ce que j'ai pu trouver sur les Storyboards sont de simples tutoriels qui vous montrent comment mettre en place un Storyboard, au lieu d'informations concrètes expliquant ce qu'ils sont.
12 réponses
un Storyboard est:
- un conteneur pour toutes vos scènes (contrôleurs de vue, contrôleurs Nav, contrôleurs TabBar, etc)
- Un gestionnaire de connexions et de transitions entre ces scènes (celles-ci sont appelées Enchaîne)
- une bonne façon de gérer la façon dont les différents contrôleurs se parlent
- Storyboards vous donnent un regard complet sur le flux de votre application que vous ne pouvez jamais obtenir de des fichiers nib flottant autour.
- Un réducteur de tous le "désordre" qui se produit lorsque vous avez plusieurs contrôleurs, chacun avec son propre fichier nib.
j'utilise des Storyboards depuis un certain temps maintenant et le seul inconvénient est que vous ne pouvez pas cibler iOS 4 ou moins. Les Storyboards ne fonctionnent que sur les appareils fonctionnant avec iOS 5 ou mieux. À part cela, les avantages sont nombreux et les inconvénients sont inexistants pour L'OMI.
Le meilleur tutoriel que j'ai vu est de Ray Wenderlich
aussi, si vous êtes membre du Programme des développeurs Apple, consultez la dernière session WWDC sur Storyboards (iTunesU), c'est génial.
un autre grand (également sur iTunesU) est le dernier Stanford iOS Application Programming course.
il n'y a pas que les avantages du Storyboarding, il y a aussi les inconvénients - juste parce que vous avez demandé des données:
- ce n'est pas facile de travailler en équipe avec SBs, car un seul participant peut travailler sur le SB en même temps (parce que c'est un seul fichier).
- ce qui suit n'est pas vrai: - si vous avez besoin de faire des choses que SB n'offre pas, il n'est pas tout à fait facile d'obtenir SB mélangé avec des vues programmatiques créées (bien, il est possible que)
la règle de base semble être: plus vous vous attendez à ce que votre projet soit complexe, plus vous feriez mieux de ne pas aller pour SB.
EDIT: - un autre inconvénient de SB: travailler autour de tous les bogues gênants de XCode concernant SB. Par exemple: devoir fréquemment vider le dossier DerivedData à cause de plusieurs incohérences. Parfois les fichiers storyboard ou le lien vers eux sont corrompus. Alors vous pourriez avoir la joie de chercher le problème. Prendre un regardez ce fil pour obtenir l'idée
EDIT 2 (mars 2013): pendant ce temps, Les Story-boards et Xcode fonctionnent beaucoup mieux, et la documentation et les meilleures pratiques sont largement répandues. Je pense que travailler avec storyboard peut être recommandé pour une majorité de projets, même s'il y a encore quelques problèmes.
EDIT 3 (Sept 2013): maintenant avec le nouveau format Xcode 5 travailler en équipes avec SB pourrait obtenir encore mieux, comme il semble devenir possible pour fusionner code SB beaucoup plus facile maintenant.
une autre édition: bien, si vous avez une heure de temps, asseyez-vous, se détendre et écouter ces gars discuter de ce sujet (Ray Wenderlich & Co)
Edit 2016.1: après avoir longtemps été un défenseur du Storyboard, j'ai eu tellement de tracas avec lui les derniers mois, que j'ai décidé d'abandonner les Storyboards autant que possible. La raison pour cela est que Apple ajoute fonctionnalité comme stupide, mais il se fiche des insectes et des défauts. La performance ayant beaucoup de contraintes de mise en page automatique est vraiment mauvaise (alors que le temps de conception), et la tendance à l'erreur-ness est devenu énorme. Exemple: les Storyboards encore moins complexes ont tendance à passer en mode "sale" juste après l'ouverture d'un projet dans Xcode (voir état git). Astuce: en tant que débutant, vous allez adorer les Storyboards car vous pouvez faire des prototypes rapidement et faire tourner les choses sans beaucoup de code. En entrant dans un état intermédiaire, vous ajouterez plus de code GUI pour votre projet. Maintenant, vous commencez à aller et venir entre le code et SB - et les choses commencent à s'arranger pire. Tôt ou tard, vous aurez tendance à faire la plupart des trucs GUI en code, parce que le résultat est plus prévisible que d'avoir plusieurs sources.
résumé
Nibs/.les fichiers xib et les Storyboards sont tous deux des fichiers D'Interface Builder qui sont utilisés pour créer visuellement une interface utilisateur pour les applications iOS et Mac dans Xcode (je vais utiliser la terminologie iOS pour les classes car cette question est étiquetée iOS mais elle s'applique également à la programmation Mac).
différences
Les " Nibs 1519170920 "sont destinés à être utilisés avec un seulUIView
. Ils peuvent également être connectés à une sous-classe UIViewController
en réglant la classe du propriétaire du fichier sur n'importe quelle sous-classe de UIViewController
et en connectant la sortie de vue (glisser pour se connecter en utilisant L'inspecteur de connexions dans le volet extrême droite de Xcode).
les Storyboards sont destinés à contenir l'interface utilisateur pour 1 ou plus UIViewController
. Vous pouvez construire votre interface utilisateur entière dans un storyboard simple ou le séparer en plus petites pièces.
avantages
Storyboards doivent toujours être utilisés en faveur de la .XIB files / Nibs (pour les contrôleurs de vue). Les Storyboards ont plus de fonctionnalités et sont activement développés par Apple.
chaque argument en faveur des Nibs s'appuie sur le fait qu'ils ont utilisé individuellement tandis que les storyboards contiennent de nombreuses scènes. Vous pouvez utiliser un seul storyboard pour chaque UIViewController
aussi facilement que vous le pouvez avec Nibs (voir exemples de code ci-dessous). Continuez à lire pour une explication détaillée et des exemples de code.
détaillé
pourquoi les Storboards sont-ils supérieurs aux Nibs?
la réponse se résume essentiellement à Apple encourageant l'utilisation de Storyboards et mettant plus d'effort de développement en eux.
- scénarios ont grande capacité de zoom Plumes qui manque. Sérieusement, vous ne pouvez pas zoomer du tout dans Nibs qui craint lors de la conception pour les plus grands écrans sur un petit ordinateur portable. Les Nibs
- manquent des fonctionnalités clés comme:
- cellules prototypes et dynamiques pour
UITableView
( plus d'info ) - Le haut de page "1519460920 de la propriété" (voir le commentaire)
- Il ya probablement plus, s'il vous plaît modifier ou de commentaire si vous avez quelque chose à ajouter à cette liste
- cellules prototypes et dynamiques pour
- vous n'avez pas besoin de jouer avec la définition de la classe du propriétaire de fichiers.
l'argument de base contre les storyboards est que le fait d'avoir tous les contrôleurs de vue à un seul endroit mène à des conflits de fusion, un Xcode lent, des temps de construction lents et d'être une douleur générale dans le derrière à maintenir. Par conséquent, le Conseil général est d'utiliser un Nib pour chaque UIViewController
.
mais... Vous pouvez simplement créer storyboard pour chaque UIViewController
. Une pratique courante (pour moi au moins) est de cacher toute l'initialisation UIViewController dans une méthode de classe (comme aucune autre classe n'a besoin de connaître le nom du fichier où se trouve le Nib/Storyboard du contrôleur).
Permet de comparer les extraits de code connexes que l'on pourrait utiliser pour créer une telle méthode. Une seule ligne de code est toute la différence entre les deux.
Objectif-C
Storyboard
+ (ViewController *)create
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ViewController" bundle:nil];
return [storyboard instantiateInitialViewController];
}
Plume
+ (ViewController *)create
{
return [super initWithNibName:@"ViewController" bundle:nil];
}
Utilisation
- (void)showMyViewController
{
ViewController *vc = [ViewController create];
[self presentViewController:vc animated:YES completion:nil];
}
Swift
Storyboard
static func create() -> ViewController {
let storyboard = UIStoryboard(name: "ViewController", bundle: NSBundle.mainBundle())
return storyboard.instantiateInitialViewController() as! ViewController
}
Plume
static func create() -> ViewController {
return ViewController(nibName: "ViewController", bundle: nil)
}
Utilisation
func showMyViewController() {
let vc = ViewController.create()
self.presentViewController(vc, animated: true, completion: nil)
}
Arguments
je vais aborder tous les arguments habituels pour les Nibs; comme je l'ai mentionné plus tôt, il ya surtout en faveur de fichiers uniques, pas comme un argument pour les Nibs plus de story-boards
- des Équipes et de la fusion de
Argument: avoir un storyboard avec beaucoup de contrôleurs de vue sera provoquer des conflits de fusion si vous travaillez sur une équipe avec plusieurs les gens à faire des changements
réponse: un seul storyboard ne provoque pas plus de conflits de fusion qu'un seul Nib
- complexité
Argument: applications très complexes ont beaucoup de scènes dans le Storyboard qui conduit à un storyboard géant qui prend une éternité à charger et est à peine compréhensible en raison de sa taille.
réponse: c'est un grand point, mais vous pouvez facilement briser Storyboards en plus petites pièces. Storyboard Références ressemble à une grande fonctionnalité qui peut être utilisée pour lier les Storyboards ensemble, mais ils ne sont disponibles que dans Xcode 7 / iOS 9+. En outre, toujours pas une raison de choisir des Nibs individuels au lieu de Storyboards.
Argument: la création d'un Nib pour chaque sous-classe UIViewController
vous permet de réutiliser le code de sorte que vous n'avez pas à configurer toutes vos contraintes et sorties pour chaque scène dans votre storyboard.
réponse: encore une fois, pas une raison de choisir des Nibs individuels plutôt que individuels Storyboard.
Il y a un belle présentation sur le Storyboard 151920920" donné à la LiDG réunion il y a quelques mois.
Personnellement, je dirais que c'est la façon de procéder avec une nouvelle application. Il y a des lacunes, surtout pour les applications très complexes, mais les avantages l'emportent sur les inconvénients.
quelques autres avantages des storyboards:
- scénarios ont un meilleur soutien pour les tableviews. C'est que vous pouvez utiliser Cellules" dynamiques "et" Prototypes".
- il est plus facile d'instancier des contrôleurs de vue en utilisant des storyboards. Vous pouvez faire des trucs comme: [se lf.storyboard instantiateViewControllerWithIdentifer:]
- Storyboards support des conteneurs de contrôleur de vue, de sorte que vous pouvez avoir des contrôleurs de vue enfants étalés graphiquement.
les inconvénients sont:
-
les Storyboards sont lents à rendre dans XCode quand ils contiennent beaucoup de contrôleurs de vue
-
Autolayout ne peut pas être activé pour un contrôleur de vue dans le storyboard.
attention, si vous utilisez des Storyboards, votre application n'est pas rétrocompatible avec les anciennes installations OS.
un storyboard est fondamentalement un dispositif pour rendre votre travail de développeur plus facile. Il est appliqué dans une série de fichiers nib, donc la performance est à peu près équivalente, mais c'est génial en tant que développeur pour être en mesure de regarder un aperçu rapide de l'ensemble du flux de votre application.
je commence à passer à l'utilisation de storyboards sur les nouveaux projets, à condition que je puisse convaincre le client d'accepter iOS 5 comme une version minimale. C'est tout simplement parce que je préfère le faire de cette façon, et cela me prend moins de temps pour accomplir les mêmes tâches.
Storyboards ont beaucoup plus de problèmes que des avantages. Voici une liste de leurs problèmes, copiée de iraycd :
-
les Storyboards échouent à l'exécution, pas au moment de la compilation : vous avez une faute de frappe dans un nom de séquence ou vous l'avez mal connecté dans votre storyboard? Il va exploser lors de l'exécution. Vous utilisez une sous-classe UIViewController personnalisée qui n'existe plus dans votre storyboard? Il va exploser lors de l'exécution. Si vous faites de telles choses en code, vous les attraperez tôt, pendant la compilation. Update : mon nouvel outil StoryboardLint résout principalement ce problème.
-
story-boards de la confusion rapide : en tant Que votre projet se développe, votre scénario devient de plus en plus difficile de naviguer. Aussi, si les contrôleurs de vues multiples ont plusieurs segments à plusieurs autres contrôleurs de vue, votre storyboard commence rapidement à ressembler à un bol de spaghetti et vous vous trouverez zoomant dans et Hors et défilant partout dans l'endroit pour trouver le contrôleur de vue que vous recherchez et pour savoir ce qui points de transition où. Update : ce problème peut être résolu principalement en divisant votre Storyboard en plusieurs Storyboards, comme décrit dans cet article de Pilky et cet article par Robert Brown .
-
les Storyboards rendent le travail en équipe plus difficile : parce que vous n'avez généralement qu'un seul gros fichier storyboard pour votre projet, avoir plusieurs développeurs apportant régulièrement des modifications à ce fichier peut être un casse-tête: les changements doivent être fusionnés et les conflits résolus. Lorsqu'un conflit survient, il est difficile de dire comment le résoudre: Xcode génère l' storyboard fichier XML et il n'a pas vraiment été conçu avec l'objectif à l'esprit qu'un homme devrait lire, et encore moins de le modifier.
-
story-boards faire des revues de code difficile ou presque impossible : par les Pairs des revues de code sont une grande chose à faire sur votre équipe. Cependant, lorsque vous apportez des modifications à un storyboard, il est presque impossible de les examiner avec un développeur différent. Tout ce que vous pouvez tirer est une diff d'un énorme fichier XML. Déchiffrer ce qui a vraiment changé et si ces changements sont corrects ou s'ils ont cassé quelque chose est vraiment difficile.
-
Storyboards hinder code reuse : dans mes projets iOS, je crée habituellement une classe qui contient toutes les couleurs et les polices et les marges et insets que j'utilise tout au long de l'application pour lui donner une apparence cohérente: c'est un changement d'une ligne si je dois ajuster l'une de ces valeurs pour l'ensemble de l'application. Si vous définissez ces valeurs dans le storyboard, vous les dupliquez et aurez besoin de trouver chaque occurrence simple quand vous voulez les changer. Il y a de fortes Chances que vous en manquiez un, parce qu'il n'y a pas de recherche et de remplacement dans les storyboards.
-
Storyboards make you do everything twice : construisez-vous une application universelle qui fonctionne à la fois sur iPad et sur iPhone? Lorsque vous utilisez storyboards, vous aurez généralement un storyboard pour la version iPad et un pour la version iPhone. Pour que les deux soient synchronisés, vous devez effectuer tous les changements D'UI ou d'app-workflow à deux endroits. Yay. Update : dans iOS 8 et Xcode 6, Vous pouvez utiliser un seul Storyboard pour iPhone et iPad.
-
les Storyboards nécessitent des commutateurs de contexte constants : je me retrouve à travailler et à naviguer beaucoup plus rapidement dans le code que dans les storyboards. Lorsque votre application utilise storyboards, vous changez constamment votre contexte: "Oh, je veux un robinet sur cette cellule de vue de table pour charger un contrôleur de vue différent. Je dois maintenant ouvrir le storyboard, trouver le bon contrôleur de vue, créer une nouvelle séquence pour l'autre contrôleur de vue (que je dois aussi trouver), donner un nom à la séquence, me souvenir de ce nom (Je ne peux pas utiliser de constantes ou de variables dans les storyboards), revenir au code et espérer ne pas confondre le nom de cette séquence pour ma méthode prepareForSegue. Comme j'aimerais pouvoir taper ces 3 lignes de code juste là où je suis!"Non, ce n'est pas amusant. Basculer entre le code et le storyboard (et entre le clavier et la souris) devient vite désuet et vous ralentit.
-
story board are hard to refactor : lorsque vous reformulez votre code, vous devez vous assurer qu'il correspond toujours à ce que votre story board attend. Lorsque vous déplacez des choses dans votre storyboard, vous ne le découvrirez à l'exécution que si cela fonctionne toujours avec votre code. Il me semble que si je dois les garder deux mondes synchronisés. Cela me semble fragile et décourage le changement à mon humble avis.
-
Storyboards are not searchable : une recherche à l'échelle du projet dans Xcode n'est pas vraiment une recherche à l'échelle du projet lorsque vous utilisez storyboards. Ils ne sont pas inclus dans la recherche. Ainsi, lorsque vous retirez une classe personnalisée de votre code ou que vous la renommez, vous devrez passer manuellement à travers le storyboard ou regarder son XML brut pour vous assurer qu'il est à la hauteur de vos modifications de code. Non monsieur, je ne l'aime pas. mise à Jour : les story-boards sont consultables dans Xcode 6.
-
story-boards sont moins flexibles : Dans le code, vous pouvez faire ce que vous voulez! Avec storyboards vous êtes limité à un sous-ensemble de ce que vous pouvez faire en code. Surtout quand vous voulez faire des choses avancées avec des animations et des transitions que vous trouverez tu te bats contre le scénario pour que ça marche.
-
story-boards ne les laissez pas vous changer le type de vue des contrôleurs : Vous souhaitez changer un
UITableViewController
dans unUICollectionViewController
? Ou dans unUIViewController
? Pas possible dans un scénario. Vous devez supprimer l'ancienne-vue-contrôleur et en créer un nouveau et re-connecter tous les enchaîne. Il est beaucoup plus facile de faire un tel changement de code. -
Storyboards ajouter deux éléments de passif supplémentaires à votre projet : (1) L'outil D'édition de storyboards qui génère le XML storyboard et (2) le composant runtime qui analyse le XML et crée des objets UI et controller à partir de celui-ci. Les deux parties peuvent avoir des bugs que vous ne pouvez pas corriger.
-
les Storyboards ne vous permettent pas d'ajouter un subview à un
UIImageView
: qui sait pourquoi. -
Storyboards don't allow you to enable Auto Layout for individual View(-Controller)s : en cochant/décochant L'option Auto Layout dans un Storyboard, le changement est appliqué à tous les contrôleurs dans le Storyboard. (Merci à Sava Mazăre pour ce point!)
-
les Storyboards ont un risque plus élevé de rompre la compatibilité ascendante : Xcode change parfois le Storyboard format de fichier et ne garantit en aucune façon que vous serez en mesure d'ouvrir Storyboard fichiers que vous créez aujourd'hui, quelques mois ou les années à partir de maintenant. (Merci à thoughtavances pour ce point. voir le commentaire original )
-
C'est Mcdonald's : pour le dire À Steve Jobs mots à propos de Microsoft: C'est Mcdonald's (vidéo) !
votre attitude envers la mise en page automatique peut également affecter si vous voulez utiliser des Storyboards. En utilisant xibs vous pouvez activer ou désactiver Auto Layout est sur un per .base xib, permettant un mélange dans votre application, tandis que Storyboards appliquer votre choix à toutes les vues qu'ils contiennent.
vous voyez le tableau d'ensemble en une seconde. Avec beaucoup de fichiers NIB, on ne voit pas la situation dans son ensemble. Plus facile de maintenir vos programmes. Plus facile de comprendre les autres programmes... parmi les autres.
avantages:
1) Il est très agréable de concevoir des interfaces
2) Vous pouvez utiliser StoryBoard Segues pour identifier la navigation/les relations modales d'une manière cool.
3) Si votre application Supporte plusieurs appareils, c'est une bonne façon d'organiser différentes vues.
4) le prototypage est un autre avantage supplémentaire.
5) Le Prototype Uitable Viewcell peut sauver le temps et il réduisent la quantité du code aussi.
6) Vous pouvez voir tous les écrans de l'application à un endroit en utilisant StoryBoard.
7) vous pouvez facilement voir la relation entre eux
8) Si vous travaillez sur le code de quelqu'un, vous pouvez obtenir une meilleure compréhension du flux de l'application.
9) Vous pouvez configurer l'interface utilisateur pour iPhone 4 et iPhone 5 en appliquant le facteur de forme de la rétine de storyboard, sans l'exécution de l'application, encore et encore.
10) les Clients peuvent voir le prototype de l'application avant de commencer à développer, ici, storyboard vous aide beaucoup.
inconvénients:
1) Il n'est disponible qu'en iOS 5 +
2) StoryBoardSegues sont un peu rigides et vous pouvez faire usage de prepareForSegue de nombreuses fois.
4) comme IB, pas très amical avec autres moteurs d'affichage et boîtes à outils.
4) rend difficile de partager des dessins pour une vue unique ou un ensemble de vues - vous devez envoyer tout ou rien.
5) pour storyboard vous aurez besoin d'un grand écran spécialement en cas d'iPad.
6) difficulté à copier des vues d'autres applications vers storyboard.
7) problèmes dans storyboard lorsque plusieurs développeurs travaillent sur le même projet en utilisant le dépôt git
copié à partir d'une certaine ressource
avant iOS 7, les Storyboards étaient un peu soignés mais pas un must. Ils ont introduit autant de problèmes qu'ils ont résolus. iOS 7 a fait pencher la balance vers les Storyboards.
avec iOS 8 et 9 ce n'est plus une question: utilisez des storyboards!
le principal inconvénient de storyboard est que vous êtes complètement dépendant de XCode, et vous pourriez finir par passer des heures à tourner vos roues sur les bogues XCode. Mais XCode a obtenu un beaucoup mieux, et les avantages avec Storyboards sont maintenant trop nombreux à ignorer. Les prototypes de cellules de vue de Table, les classes de taille, le soutien de mise en page automatique et ainsi de suite.
Quelques Conseils:
- pensez à chaque Storyboard comme un conteneur pour les contrôleurs de vue qui appartiennent ensemble. Ne pensez pas que c'est une grande mise en page de votre application.
- vous pourriez avoir besoin de plus d'un Storyboard
- Enchaîne sont vraiment seulement utile pour les cas d'utilisation les plus insignifiants - ils sont parfaits pour cela. Mais dans une application du monde réel, de nombreuses transitions se produiront à partir de l'intérieur du code. Et c'est OK.
- écrire une catégorie aux contrôleurs de vue programmatiques instanciate du storyboard(s) donc tout ce que vous avez à faire est de laisser vc=SomeViewController.create (), où la méthode gère tous les détails (tirer le panneau d'histoire, tirer le contrôleur de vue hors du panneau d'histoire etc.)