Storyboards sind aus Sicht des Git-Workflows eher ein königlicher Schmerz, wenn mehrere Personen an ihnen zusammenarbeiten. Beispielsweise werden für das XML in der .storyboard-Datei die Start- <document>
Tags toolsVersion
und systemVersion
Attribute geändert, je nachdem, welche Konfiguration der neueste Dateimanipulator gerade ausführt . Die genaue Synchronisierung aller Xcode-Versionen scheint hilfreich zu sein toolsVersion
, systemVersion
ändert sich jedoch unabhängig von der jeweiligen Mac- und / oder OS X-Version, die der Entwickler ausführt.
Das ist idiotisch, aber meistens harmlos. Was uns jedoch beunruhigt, ist, dass zu anderen Zeiten einige andere Änderungen automatisch am Storyboard vorgenommen werden, indem sie nach a geöffnet werden git pull
. Das heißt, Alice nimmt Änderungen an einem Storyboard vor, schreibt sie fest und schiebt sie in das Repository. Bob zieht dann Alices Änderungen und öffnet das Storyboard, um weitere Änderungen vorzunehmen. Sobald er das Storyboard öffnet, wechselt das Dateisymbol sofort in einen geänderten, aber nicht gespeicherten Zustand und git status
zeigt an, dass eine beliebige Anzahl seltsamer Änderungen aufgetreten ist. All dies, ohne dass Bob etwas geändert oder die Datei selbst gespeichert hat.
Die häufigste automatisierte Änderung ist das Verschwinden oder Wiedererscheinen der gesamten <classes>
Tag-Hierarchie am Ende einer Storyboard-Datei. Wir haben nicht herausgefunden, was dies verursacht. Möglicherweise befinden sich mehrere lokalisierte Versionen eines Storyboards in verschiedenen .lproj-Verzeichnissen. Wenn Sie diese in Interface Builder öffnen, wird die Klassenhierarchie möglicherweise spontan von einigen entfernt und in andere eingefügt oder in einigen allein gelassen. Dies verursacht viel Rauschen git diff
, beeinträchtigt jedoch keine Funktionalität. Wir werden oft selektiv die tatsächlichen Änderungen, die wir vorgenommen haben, in den git-Index einfügen, diese festschreiben und dann einfach das spontane, unsinnige verwerfen<classes>
Änderungen. Dies dient dazu, die Commits klein und nett zu halten, wie sie sein sollten. Irgendwann wird es jedoch einfach zu viel, um sich damit zu beschäftigen, da Xcode die Änderungen immer wieder wiederholt und jemand sie zusammen mit einigen anderen Dingen erneut zusagt ... was in Ordnung ist, bis der Xcode eines anderen beschließt, sie für Nein zurück zu ändern ersichtlichen Grund. (Unsere Commit-Geschichte hat viel Schwur darüber.)
Hat jemand anderes dieses Verhalten gesehen? Ist dies ein Xcode-Fehler oder ein Konfigurationsproblem auf einem oder mehreren unserer Entwickler-Macs? Wir haben bei der Zusammenarbeit mit XIB-Dateien ein ähnliches Verhalten festgestellt, aber Storyboards scheinen dafür anfälliger zu sein.
quelle
Antworten:
Dies ist kein Fehler, sondern eine Folge der Verarbeitung von Storyboard-Dateien durch Xcode. Ich schreibe ein Diff- und Merge-Programm für Storyboard-Dateien (GitHub-Link) und habe Stunden damit verbracht, die Logik der Storyboard-Dateien und deren Verarbeitung durch Xcode zu analysieren. Folgendes habe ich entdeckt:
Warum treten seltsame Änderungen in Storyboard-Dateien auf? Xcode verwendet die NSXML-API, um Storyboard-Dateien in eine
NSSet
logische Baumstruktur zu analysieren . Wenn Xcode Änderungen schreiben muss, erstellt es eineNSXMLDocument
basierend auf der logischen Baumstruktur, löscht die Storyboard-Datei und ruftXMLDataWithOptions:
auf, um die Datei erneut zu füllen. Da Sets die Reihenfolge ihrer Elemente nicht beibehalten, kann bereits die geringste Änderung die gesamte Storyboard-XML-Datei ändern.Warum verschwindet das Klassen-Tag oder erscheint zufällig wieder? Der
<class>
Abschnitt ist nichts weiter als ein interner Xcode-Cache. Xcode verwendet es, um Informationen über Klassen zwischenzuspeichern. Der Cache ändert sich häufig. Elemente werden hinzugefügt, wenn Klassendateien.h/.m
geöffnet und entfernt werden, wenn Xcode den Verdacht hat, dass sie veraltet sind (zumindest ältere Xcodes verhalten sich so). Wenn Sie das Storyboard speichern, wird die aktuelle Version des Caches ausgegeben, weshalb sich der<class>
Abschnitt häufig ändert oder sogar verschwindet.Ich habe Xcode nicht rückentwickelt. Ich habe diese Beobachtungen gemacht, indem ich mit Xcode- und Storyboard-Dateien experimentiert habe. Trotzdem bin ich mir fast zu 100% sicher, dass es so funktioniert.
Schlussfolgerungen :
MyController1
View Controller in einem Storyboard-Dokument geändert . Öffnen Sie die Storyboard-Datei und suchen Sie so etwas<viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>
. Sie können sicher nur Änderungen in diesem Abschnitt festschreiben und alles andere ignorieren. Wenn Sie Segmente oder Einschränkungen geändert haben, legen Sie auch alles fest, was darin enthalten ist“ory-XY-OBM”
. Einfach!quelle
Dies ist ein Fehler in XCode 4.5+, ich hoffe, er wird behoben, und ja, es ist eine PITA.
Hier ist der vollständige Fehler bei Apple
Wie vermeide ich kostenlose Xcode-Änderungen an Storyboard-Dateien?
quelle
Dieses Problem kann durch eine äußerst umsichtige Verwendung von
git add -p
generierten Xcode-Dateien, einschließlich Storyboards, XIBs, Core Data-Modellen und Projektdateien, die alle unter ähnlichen vorübergehenden Änderungen leiden, die keine Auswirkungen auf die tatsächliche Schnittstelle / das tatsächliche Modell / haben , etwas gemildert werden. Projekt.Die häufigsten Junk-Änderungen, die ich auf Storyboards gesehen habe, sind die Versionsnummern des Systems (wie Sie bereits erwähnt haben) und das ständige Hinzufügen und Entfernen des
<classes>
Abschnitts, dessen Auslassung ich noch nie gesehen habe, verursacht Probleme. Für XIBs ist es das Hinzufügen und Entfernen von<reference key="NSWindow"/>
, was in Cocoa Touch nicht einmal eine Klasse ist. Einfach wow.Stellen Sie es sich wie das Meer vor: Es gibt sowohl Flut als auch Ebbe. Lass es dich überfluten.
Ahh. Das ist es.
Sie können diese Änderungen ignorieren, wenn Sie Ihre Änderungen bereitstellen, die Junk-Änderungen zurücksetzen und ein sauberes Commit durchführen.
Der einzige Vorteil, den ich aus technischer Sicht bei Storyboards gegenüber XIBs gesehen habe, ist, dass Apple FileMerge noch nicht kastriert hat, um das Zusammenführen von Storyboards mit Konflikten zu verweigern. (FileMerge war früher in der Lage, XIBs zusammenzuführen, aber neuere Versionen haben das kaputt gemacht. Thxxxx Leute 💜 !!!)
Bitte melden Sie viele Fehler zu all diesen Problemen unter http://bugreporter.apple.com/ an ! Und vergessen Sie nicht, Einträge in OpenRadar zu erstellen .
quelle
Wir werfen hier eine andere Antwort auf, weil sich diese Situation stark verbessert hat. Das XML für die XIB-Datei, die das StoryBoard darstellt, wurde erheblich vereinfacht.
Ich habe auch kürzlich die Kugel gebissen und begonnen, die Schnittstelle in Xcode zur Quellcodeverwaltung zu verwenden. Ich bin seit Jahren in der Befehlszeile und dort glücklich, aber die Benutzeroberfläche ist nett und ermöglicht das Aufteilen von Commits. Dies ist sehr wichtig, wenn Sie ein Ticketing-System verwenden, das mit Commits verknüpft ist.
Wie auch immer, ich habe heute bemerkt, dass es eine Änderung im Storyboard gab und das eingebaute Diff zeigte mir, dass es sich um ein einzelnes Attribut im Dokument-Tag (systemVersion) handelt. Also keine große Sache.
Ich habe Artikel gelesen, in denen Leute sagen, dass SBs in ihren Teams wegen Zusammenführungsproblemen verboten waren. Totaler Wahnsinn. Sie sind so erstaunlich, besonders jetzt, wo sie ein intelligentes Autolayout haben, das Sie wirklich verpassen, wenn Sie sie nicht verwenden.
quelle
Es ist hilfreich zu wissen, warum dieser Wahnsinn passiert, aber für diejenigen, die daran glauben, ihre Projekte frei von Warnungen zu halten und nur schnell und schmutzig wollen, um ihre Projekte wieder in einen gesunden Zustand zu bringen:
Legen Sie nichts fest, bis Sie ausdrücklich dazu aufgefordert werden.
Öffnen Sie Xcode und erstellen Sie ein neues Storyboard (Befehl + N> iOS> Benutzeroberfläche> Storyboard). Ich gehe davon aus, dass Sie es den Standardnamen von nennen
Storyboard.storyboard
.Öffnen Sie das Storyboard, gegen das Xcode verstoßen hat. Ich gehe davon aus, dass dies der Fall ist
Base.lproj/Main.storyboard
.Wählen Sie alles im Storyboard aus und kopieren Sie es (Befehl + A, dann Befehl + C).
Öffnen
Storyboard.storyboard
.Kopieren Sie alles und fügen Sie es ein
Storyboard.storyboard
.Schließen Sie Xcode.
Öffnen Sie ein Terminal und ändern Sie die Verzeichnisse in Ihr Repository.
Ersetzen Sie
Main.storyboard
durchStoryboard.storyboard
(mv Storyboard.storyboard Base.lproj/Main.storyboard
).git add Base.lproj/Main.storyboard; git commit -m "Fix Xcode's insanity."
Ignorieren Sie die Änderungen an
project.pbxproj
viagit checkout -- project.pbxproj
. Wenn Siegit diff
die Datei verwenden, werden Sie feststellen, dass gerade Informationen zu unserem temporären Storyboard hinzugefügt wurden (das nicht mehr vorhanden ist).Öffnen Sie die Xcode-Sicherung und stellen Sie sicher, dass die Warnungen verschwunden sind.
Atmen.
quelle
Die Arbeit am selben Storyboard ist kein Problem. Die Arbeit an demselben Viewcontroller, der beim Ziehen / Zusammenführen zu Konflikten führt, ist jedoch erschreckend. Wir können es nicht wirklich vermeiden, dass wir für ein großes Team im selben Viewcontroller arbeiten.
Gut ist, dass wir meistens dieselben Viewcontroller-Konflikte beheben können, wenn wir die XML-Struktur verstehen. Ich habe es nie versäumt, diese während der Arbeit im Team zusammenzuführen. Angenommen, Sie arbeiten mit einem Viewcontroller. Ihre Ansicht ist derzeit leer. Bitte schauen Sie sich die XML-Struktur des Viewcontrollers aus der Quellcode-Option an.
Das Storyboard ist eine XML-Datei, die durch ein Dokumenttyp-Tag begrenzt ist. Alles im Storyboard enthält in scene sceneID = tag. Das Szenen-Tag enthält alle Viewcontroller. Das ist das Grundlegende.
Jetzt haben wir der Ansicht ein UILabel und einen UIButton hinzugefügt. Stellen Sie auch das Autolayout der Elemente ein. Jetzt sieht es so aus:
Durch Hinzufügen einer Ebene / Schaltfläche zum Ansichtscontroller wurde neuer Code in das Unteransichtstag der Ansicht eingefügt. Das Gleiche gilt für weitere Elemente oder Änderungen an der Benutzeroberfläche. Überprüfen Sie sorgfältig die Tag-Struktur, die wirklich wichtig ist, um Konflikte zu beheben.
Jetzt fügen wir dem Storyboard-Namen Homeviewcontroller einen weiteren Viewcontroller hinzu. Durch Hinzufügen eines neuen Ansichtscontrollers wird eine neue Szene unter dem Tag "Szenen" hinzugefügt. Schau dir das an:
An diesem Punkt werden wir die Struktur zufällig ändern und die Probleme / Warnungen beobachten. Wir ändern das End-Tag des ersten Viewcontroller-Labels und speichern die Datei. Führen Sie es jetzt aus und sehen Sie sich die Warnung an. Der Fehler besagt, dass das aus Zeile 23 erstellte End-Tag nicht korrekt ist. In Zeile 23 wird angezeigt, dass Beschriftungsbeschränkungen ohne End-Tag festgelegt sind. Das ist das Problem. Jetzt setzen wir das End-Tag und erstellen das Projekt. Nach dem Festlegen des End-Tags können wir das Storyboard erfolgreich anzeigen.
Wenn Sie vor Konflikten gewarnt werden, vergleichen Sie diese bitte mit Ihrer vorherigen Quelle und ändern Sie die Quelle. Wir entfernen den alten / redundanten Code, behalten den neuen Code mit dem richtigen Tag-Start-Ende bei und reparieren die Dinge.
[NB, ich werde die Antwort mit einigen weiteren Testfällen aktualisieren, wenn ich Zeiten bekomme]
quelle