Storyboard agak sakit kerajaan dari perspektif alur kerja git ketika banyak orang berkolaborasi pada mereka. Misalnya, XML dalam file .storyboard memiliki <document>
tag awal toolsVersion
dan systemVersion
atribut yang diubah oleh konfigurasi apa pun yang sedang dijalankan oleh manipulator file terbaru. Menyinkronkan semua versi Xcode tampaknya justru membantu toolsVersion
, tetapi systemVersion
perubahan apa pun yang terjadi, tergantung pada versi Mac dan / atau OS X tertentu yang sedang dijalankan pengembang.
Ini bodoh, tetapi kebanyakan tidak berbahaya. Yang membuat kami khawatir, adalah bahwa di waktu lain beberapa perubahan lain secara otomatis dibuat ke storyboard hanya dengan membukanya setelah a git pull
. Dengan kata lain, Alice membuat perubahan pada storyboard, melakukan dan mendorongnya ke repositori. Bob kemudian menarik perubahan Alice dan membuka papan cerita untuk membuat perubahan lebih lanjut. Saat dia membuka storyboard, ikon file segera berubah ke keadaan yang dimodifikasi tetapi tidak disimpan, dan git status
menunjukkan bahwa sejumlah perubahan aneh telah terjadi. Semua ini tanpa Bob telah mengubah apa pun atau menyimpan file sendiri.
Perubahan otomatis paling umum yang kami lihat adalah hilangnya atau kemunculan kembali seluruh <classes>
hierarki tag di dekat akhir file storyboard. Kami belum menemukan apa yang menyebabkan ini. Kami mungkin memiliki beberapa versi lokal storyboard di berbagai direktori .lproj, dan ketika membukanya di dalam Interface Builder, hierarki kelas dapat secara spontan dihapus dari beberapa dan ditambahkan ke yang lain, atau dibiarkan sendiri di beberapa. Ini menyebabkan banyak kebisingan git diff
, tetapi sebenarnya tidak merusak fungsionalitas apa pun. Kita akan sering secara selektif menambahkan perubahan aktual yang kita buat ke dalam indeks git, melakukan itu, dan kemudian hanya membuang spontan, tidak masuk akal<classes>
perubahan. Ini untuk menjaga komitmen kecil dan baik, sebagaimana mestinya. Namun, pada akhirnya, itu menjadi terlalu merepotkan karena Xcode terus melakukan perubahan lagi, dan seseorang hanya memeriksanya bersama dengan beberapa hal lain ... yang baik-baik saja sampai Xcode orang lain memutuskan ingin mengubahnya kembali tanpa alasan yang jelas. (Riwayat komit kami memiliki banyak sumpah untuk ini.)
Adakah orang lain yang melihat perilaku ini? Apakah ini bug Xcode atau masalah konfigurasi pada satu atau lebih Mac pengembang kami? Kami telah melihat beberapa perilaku serupa ketika berkolaborasi dengan file XIB, tetapi storyboard tampaknya lebih rentan terhadap ini.
sumber
Jawaban:
Ini bukan bug, ini adalah konsekuensi dari bagaimana Xcode memproses file storyboard. Saya menulis program diff dan gabung untuk file storyboard (tautan GitHub) dan saya telah menghabiskan waktu berjam-jam menganalisis logika file storyboard dan bagaimana Xcode memprosesnya. Inilah yang saya temukan:
Mengapa perubahan aneh terjadi pada file storyboard? Xcode menggunakan NSXML API untuk mem-parsing file storyboard menjadi beberapa
NSSet
struktur pohon logis. Ketika Xcode perlu menulis perubahan, itu menciptakan sebuahNSXMLDocument
berdasarkan pada struktur pohon logis, menghapus file storyboard dan panggilanXMLDataWithOptions:
untuk mengisi file lagi. Karena set tidak mempertahankan urutan elemennya, bahkan modifikasi sekecil apa pun dapat mengubah seluruh file XML storyboard.Mengapa tag kelas hilang atau muncul kembali secara acak? The
<class>
Bagian tidak lebih dari cache Xcode internal. Xcode menggunakannya untuk menyimpan informasi tentang kelas. Cache sering berubah. Elemen ditambahkan ketika.h/.m
file kelas dibuka dan dihapus ketika Xcode menduga mereka sudah usang (setidaknya Xcode lama berperilaku seperti ini). Ketika Anda menyimpan storyboard, yang saat ini versi cache dibuang, yang mengapa<class>
bagian sering berubah atau bahkan menghilang.Saya belum melakukan rekayasa ulang Xcode; Saya melakukan pengamatan ini dengan bereksperimen dengan file Xcode dan storyboard. Namun demikian, saya hampir 100% yakin itu bekerja dengan cara ini.
Kesimpulan :
MyController1
pengontrol tampilan dalam dokumen storyboard. Buka file storyboard, dan temukan sesuatu seperti ini<viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>
. Anda hanya dapat melakukan perubahan di bagian ini dengan aman dan mengabaikan yang lainnya. Jika Anda mengubah segue atau kendala, lakukan juga apa yang ada“ory-XY-OBM”
di dalamnya. Sederhana!sumber
Ini adalah bug di XCode 4.5+, saya harap itu diperbaiki, dan ya itu PITA.
Inilah bug lengkapnya di Apple
Bagaimana cara menghindari pengeditan Xcode gratis untuk file storyboard?
sumber
Masalah ini dapat dikurangi dengan penggunaan yang sangat bijaksana
git add -p
pada setiap file yang dihasilkan Xcode, termasuk storyboard, XIB, model Data Inti, dan file proyek, yang semuanya menderita modifikasi sementara yang serupa yang tidak berdampak pada antarmuka / model yang sebenarnya / proyek.Perubahan sampah yang paling umum yang pernah saya lihat di storyboard adalah nomor versi sistem (seperti yang Anda sebutkan) dan penambahan dan penghapusan
<classes>
bagian yang konstan , kelalaian yang belum pernah saya lihat menyebabkan masalah. Untuk XIB, ini adalah penambahan dan penghapusan<reference key="NSWindow"/>
, yang bahkan bukan kelas di Cocoa Touch. Cuma wow.Pikirkan itu seperti laut: ada air pasang dan surut. Biarkan itu menyapu Anda.
Ahh. Itu dia.
Anda dapat mengabaikan modifikasi ini saat melakukan perubahan, mereset perubahan sampah, dan melakukan commit bersih.
Keuntungan tunggal yang saya lihat dengan storyboard dibanding XIB dari sudut pandang teknis adalah bahwa Apple belum mensterilkan FileMerge untuk menolak menggabungkan storyboard yang bertentangan. (FileMerge digunakan untuk dapat menggabungkan XIB, tetapi versi yang lebih baru mematahkannya. Thxxxx guys 💜 !!!)
Silakan ajukan banyak bug tentang semua masalah ini di http://bugreporter.apple.com/ ! Dan jangan lupa untuk membuat entri di OpenRadar .
sumber
Melontarkan jawaban lain di sini karena situasi ini telah sangat meningkat. XML untuk file XIB yang mewakili StoryBoard telah sangat disederhanakan.
Saya juga baru saja menggigit peluru dan mulai menggunakan antarmuka dalam Xcode ke Kontrol Sumber. Saya telah berada di baris perintah selama bertahun-tahun dan senang di sana, tetapi antarmuka yang bagus dan memungkinkan Anda membagi komit, yang sangat penting jika Anda menggunakan sistem tiket yang menghubungkan ke komit.
Bagaimanapun, saya perhatikan hari ini bahwa ada perubahan pada storyboard dan diff built in menunjukkan kepada saya itu adalah atribut tunggal dalam tag dokumen (systemVersion). Jadi bukan masalah besar.
Saya telah membaca artikel di mana orang mengatakan SB dilarang di tim mereka karena masalah penggabungan. Kegilaan total. Mereka sangat menakjubkan, terutama sekarang karena mereka memiliki autolayout yang cerdas, Anda benar-benar kehilangan jika Anda tidak menggunakannya.
sumber
Sangat membantu untuk mengetahui mengapa kegilaan ini terjadi, tetapi bagi mereka yang percaya menjaga proyek mereka bebas dari peringatan dan yang hanya ingin yang cepat dan kotor untuk mengembalikan proyek mereka ke keadaan yang sehat:
Jangan melakukan apa pun sampai diperintahkan secara eksplisit.
Buka Xcode dan buat storyboard baru (Command + N> iOS> User Interface> Storyboard). Saya akan menganggap Anda menyebutnya nama default
Storyboard.storyboard
.Buka storyboard yang dilanggar Xcode. Saya akan menganggap ini
Base.lproj/Main.storyboard
.Pilih dan salin semua yang ada di storyboard (Command + A lalu Command + C).
Terbuka
Storyboard.storyboard
.Salin dan rekatkan semuanya ke
Storyboard.storyboard
.Tutup Xcode.
Buka terminal dan ubah direktori ke repositori Anda.
Ganti
Main.storyboard
denganStoryboard.storyboard
(mv Storyboard.storyboard Base.lproj/Main.storyboard
).git add Base.lproj/Main.storyboard; git commit -m "Fix Xcode's insanity."
Abaikan perubahan
project.pbxproj
melaluigit checkout -- project.pbxproj
. Jika Andagit diff
file, Anda akan melihat bahwa itu baru saja menambahkan informasi tentang storyboard sementara kami (yang tidak ada lagi).Buka Xcode cadangan dan lihat bahwa peringatan telah menghilang.
Bernafas.
sumber
Bekerja di storyboard yang sama bukanlah masalah. Tetapi bekerja pada viewcontroller yang sama yang menciptakan konflik pada tarikan / penggabungan menakutkan. kita tidak bisa benar-benar menghindari itu bekerja di viewcontroller yang sama untuk tim besar.
Untungnya, sebagian besar waktu kita dapat memperbaiki konflik viewcontroller yang sama jika kita memahami struktur xml. Saya tidak pernah gagal menggabungkan ini saat bekerja dalam tim. Misalkan Anda bekerja dengan viewcontroller. Tampilan Anda kosong saat ini. Silakan, lihat struktur xml viewcontroller dari opsi kode sumber.
Storyboard dibatasi xml oleh tag jenis dokumen. Semua yang ada di storyboard berisi adegan sceneID = tag. tag pemandangan memegang setiap viewcontrollers. Itulah dasar.
Sekarang kami menambahkan UILabel dan UIButton pada tampilan. Juga mengatur autolayout elemen. Sekarang sepertinya:
Menambahkan level / tombol ke viewcontroller menambahkan beberapa kode baru di dalam tag tampilan subview. Hal yang sama akan berlaku untuk penambahan elemen lebih lanjut atau perubahan UI apa pun. Hati-hati memeriksa struktur tag yang benar-benar penting untuk memperbaiki konflik.
Sekarang kita menambahkan viewcontroller lain dalam nama storyboard Homeviewcontroller. Menambahkan viewcontroller baru berarti menambahkan adegan baru di bawah tag adegan. Lihat ini:
Pada titik ini, kami akan mengubah struktur secara acak dan mengamati masalah / peringatan. Kami mengubah tag akhir label viewcontroller pertama dan menyimpan file. Sekarang jalankan dan lihat peringatannya. Kesalahan mengatakan tag akhir tidak benar yang dibuat dari baris 23. Pada baris 23, kita melihat batasan label diatur tanpa tag akhir. Itulah masalahnya. Sekarang kita meletakkan tag akhir dan membangun proyek. Setelah mengatur tag akhir, kita dapat melihat storyboard dengan sukses.
Saat menghadapi peringatan konflik, silakan bandingkan dengan sumber Anda sebelumnya dan sumber perubahan. Kami menghapus kode lama / redundan, menyimpan kode baru dengan tag awal yang benar dan menyelesaikan masalah.
[NB, saya akan memperbarui jawabannya dengan beberapa test case lagi ketika mendapat waktu]
sumber