Update 12.01.2016 : Es ist 2016 und ich bevorzuge es immer noch, meine Benutzeroberflächen im Code und nicht in Storyboards auszulegen. Davon abgesehen haben Storyboards einen langen Weg zurückgelegt. Ich habe alle Punkte aus diesem Beitrag entfernt, die 2016 einfach nicht mehr zutreffen.
Update 24.04.2015 : Interessanterweise verwendet Apple nicht einmal Storyboards in seinem kürzlich veröffentlichten ResearchKit, wie Peter Steinberger bemerkt hat (unter der Überschrift "Interface Builder").
Update 10.06.2014 : Wie erwartet verbessert Apple Storyboards und Xcode ständig . Einige der Punkte, die für iOS 7 und niedriger gelten, gelten nicht mehr für iOS 8 (und sind jetzt als solche gekennzeichnet). Während Storyboards von Natur aus immer noch Fehler aufweisen, überarbeite ich meinen Rat von " Nicht verwenden", um selektiv zu verwenden, wo es sinnvoll ist .
Selbst jetzt, wo iOS 9 herauskommt, würde ich raten gegenVorsicht bei der Entscheidung, ob Storyboards verwendet werden sollen. Hier sind meine Gründe:
Storyboards schlagen zur Laufzeit fehl, nicht zur Kompilierungszeit : Sie haben einen Tippfehler in einem Segue-Namen oder haben ihn in Ihrem Storyboard falsch verbunden? Es wird zur Laufzeit explodieren. Sie verwenden eine benutzerdefinierte UIViewController-Unterklasse, die in Ihrem Storyboard nicht mehr vorhanden ist? Es wird zur Laufzeit explodieren. Wenn Sie solche Dinge im Code tun, werden Sie sie während der Kompilierungszeit frühzeitig abfangen. Update : Mein neues Tool StoryboardLint löst dieses Problem größtenteils.
Storyboards werden schnell verwirrend : Wenn Ihr Projekt wächst, wird die Navigation in Ihrem Storyboard immer schwieriger. Wenn mehrere Ansichts-Controller mehrere Abschnitte zu mehreren anderen Ansichts-Controllern haben, sieht Ihr Storyboard schnell wie eine Schüssel Spaghetti aus, und Sie zoomen hinein und heraus und scrollen überall herum, um den gewünschten Ansichts-Controller zu finden für und um herauszufinden, welche Segue Punkte wo. Update : Dieses Problem kann größtenteils gelöst werden, indem Sie Ihr Storyboard in mehrere Storyboards aufteilen , wie in diesem Artikel von Pilky und diesem Artikel von Robert Brown beschrieben .
Storyboards erschweren die Arbeit in einem Team : Da Sie normalerweise nur eine große Storyboard-Datei für Ihr Projekt haben, kann es Kopfschmerzen bereiten, wenn mehrere Entwickler regelmäßig Änderungen an dieser einen Datei vornehmen: Änderungen müssen zusammengeführt und Konflikte gelöst werden. Wenn ein Konflikt auftritt, ist es schwer zu sagen, wie er gelöst werden kann: Xcode generiert die Storyboard-XML-Datei und wurde nicht wirklich mit dem Ziel entwickelt, dass ein Mensch sie lesen oder gar bearbeiten müsste.
Storyboards machen Codeüberprüfungen schwierig oder nahezu unmöglich : Peer-Codeüberprüfungen sind eine großartige Sache für Ihr Team. Wenn Sie jedoch Änderungen an einem Storyboard vornehmen, ist es fast unmöglich, diese Änderungen mit einem anderen Entwickler zu überprüfen. Alles, was Sie aufrufen können, ist ein Unterschied zu einer riesigen XML-Datei. Es ist wirklich schwer zu entschlüsseln, was sich wirklich geändert hat und ob diese Änderungen korrekt sind oder ob sie etwas kaputt gemacht haben.
Storyboards behindern die Wiederverwendung von Code : In meinen iOS-Projekten erstelle ich normalerweise eine Klasse, die alle Farben, Schriftarten, Ränder und Einfügungen enthält, die ich in der gesamten App verwende, um ein einheitliches Erscheinungsbild zu erzielen: Es ist eine einzeilige Änderung, wenn ich muss Passen Sie einen dieser Werte für die gesamte App an. Wenn Sie solche Werte im Storyboard festlegen, duplizieren Sie sie und müssen jedes einzelne Vorkommen finden, wenn Sie sie ändern möchten. Die Chancen stehen gut, dass Sie eines verpassen, da Storyboards nicht gesucht und ersetzt werden müssen.
Storyboards erfordern ständige Kontextwechsel : Ich arbeite und navigiere im Code viel schneller als in Storyboards. Wenn Ihre App Storyboards verwendet, wechseln Sie ständig Ihren Kontext: "Oh, ich möchte auf diese Tabellenansichtszelle tippen, um einen anderen Ansichts-Controller zu laden. Ich muss jetzt das Storyboard öffnen, den richtigen Ansichts-Controller finden und einen neuen Abschnitt erstellen Geben Sie dem Segue einen Namen, merken Sie sich diesen Namen (ich kann keine Konstanten oder Variablen in Storyboards verwenden), wechseln Sie zurück zum Code und hoffen Sie, dass ich den Namen nicht falsch schreibe das segue für meine prepareForSegue-Methode. Wie ich wünschte, ich könnte diese 3 Codezeilen genau hier eingeben, wo ich bin! " Nein, es macht keinen Spaß. Das Umschalten zwischen Code und Storyboard (sowie zwischen Tastatur und Maus) wird schnell alt und verlangsamt Sie.
Storyboards sind schwer umzugestalten : Wenn Sie Ihren Code umgestalten, müssen Sie sicherstellen, dass er immer noch den Erwartungen Ihres Storyboards entspricht. Wenn Sie Dinge in Ihrem Storyboard verschieben, werden Sie zur Laufzeit nur herausfinden, ob es noch mit Ihrem Code funktioniert. Es fühlt sich für mich so an, als müsste ich zwei Welten synchron halten. Es fühlt sich brüchig an und entmutigt Veränderungen meiner bescheidenen Meinung nach.
Storyboards sind weniger flexibel : Im Code können Sie grundsätzlich alles tun, was Sie wollen! Mit Storyboards sind Sie auf eine Teilmenge dessen beschränkt, was Sie im Code tun können. Besonders wenn Sie einige fortgeschrittene Dinge mit Animationen und Übergängen machen möchten, werden Sie feststellen, dass Sie "gegen das Storyboard kämpfen", um es zum Laufen zu bringen.
Mit Storyboards können Sie den Typ der speziellen Ansichtssteuerungen nicht ändern : Sie möchten a UITableViewController
in a ändern UICollectionViewController
? Oder in eine Ebene UIViewController
? In einem Storyboard nicht möglich. Sie müssen den alten Ansichts-Controller löschen, einen neuen erstellen und alle Segmente erneut verbinden. Es ist viel einfacher, eine solche Codeänderung vorzunehmen.
Storyboards fügen Ihrem Projekt zwei zusätzliche Verpflichtungen hinzu : (1) Das Storyboard-Editor-Tool, das das Storyboard-XML generiert, und (2) die Laufzeitkomponente, die das XML analysiert und daraus UI- und Controller-Objekte erstellt. Beide Teile können Fehler enthalten, die Sie nicht beheben können.
In Storyboards können Sie keine Unteransicht zu einem hinzufügenUIImageView
: Wer weiß warum.
In Storyboards können Sie das automatische Layout für einzelne Ansichten (-Controller) nicht aktivieren : Durch Aktivieren / Deaktivieren der Option Auto Layout in einem Storyboard wird die Änderung auf ALLE Controller im Storyboard angewendet. (Danke an Sava Mazăre für diesen Punkt!)
Storyboards haben ein höheres Risiko, die Abwärtskompatibilität zu beeinträchtigen : Xcode ändert manchmal das Storyboard-Dateiformat und garantiert in keiner Weise, dass Sie Storyboard-Dateien öffnen können, die Sie heute in einigen Jahren oder sogar Monaten erstellen. (Dank an nachdenkliche Fortschritte für diesen Punkt. Siehe den ursprünglichen Kommentar )
Storyboards können Ihren Code komplexer machen : Wenn Sie Ihre View Controller im Code erstellen, können Sie init
beispielsweise benutzerdefinierte Methoden erstellen initWithCustomer:
. Auf diese Weise können Sie das customer
Innere Ihres View Controllers unveränderlich machen und sicherstellen, dass dieser View Controller nicht ohne customer
Objekt erstellt werden kann. Dies ist bei Verwendung von Storyboards nicht möglich. Sie müssen warten, bis die prepareForSegue:sender:
Methode aufgerufen wird, und dann müssen Sie die customer
Eigenschaft auf Ihrem Ansichtscontroller festlegen. Dies bedeutet, dass Sie diese Eigenschaft veränderbar machen und zulassen müssen, dass der Ansichtscontroller ohne customer
Objekt erstellt wird . Nach meiner Erfahrung kann dies Ihren Code erheblich verkomplizieren und es schwieriger machen, über den Fluss Ihrer App nachzudenken. Update 09.09.16: Chris Dzombak hat einen großartigen Artikel über dieses Problem geschrieben .
Es ist McDonald's : Um es in Steve Jobs 'Worten über Microsoft zu sagen: Es ist McDonald's (Video) !
Dies sind meine Gründe, warum ich wirklich nicht gerne mit Storyboards arbeite. Einige dieser Gründe gelten auch für XIBs. Bei den Storyboard-basierten Projekten, an denen ich gearbeitet habe, haben sie mich viel mehr Zeit gekostet als gespart und die Dinge komplizierter anstatt einfacher gemacht.
Wenn ich meine Benutzeroberfläche und meinen Anwendungsfluss in Code erstelle, habe ich viel mehr Kontrolle darüber, was vor sich geht, es ist einfacher zu debuggen, es ist einfacher, Fehler frühzeitig zu erkennen, es ist einfacher, meine Änderungen anderen Entwicklern und anderen zu erklären ist einfacher, iPhone und iPad zu unterstützen.
Ich bin jedoch damit einverstanden, dass das Auslegen Ihrer gesamten Benutzeroberfläche in Code möglicherweise nicht für jedes Projekt eine einheitliche Lösung darstellt. Wenn sich Ihre iPad-Benutzeroberfläche an bestimmten Stellen stark von Ihrer iPhone-Benutzeroberfläche unterscheidet, ist es möglicherweise sinnvoll, eine XIB nur für diese Bereiche zu erstellen.
Viele der oben beschriebenen Probleme könnten von Apple behoben werden, und ich hoffe, dass sie dies tun werden.
Nur meine zwei Cent.
Update : In Xcode 5 hat Apple die Option zum Erstellen eines Projekts ohne Storyboard entfernt. Ich habe ein kleines Skript geschrieben, das die Vorlagen von Xcode 4 (mit der Option zum Deaktivieren des Storyboards) auf Xcode 5 portiert: https://github.com/jfahrenkrug/Xcode4templates