Xcode, değiştirilmemiş film şeridini ve XIB dosyalarını değiştirir


132

Öykü tahtaları, birden fazla kişi üzerinde işbirliği yaptığında, git iş akışı perspektifinden oldukça büyük bir acıdır. Örneğin, .storyboard dosyasındaki XML'nin başlangıç <document>etiketi toolsVersionve systemVersionöznitelikleri, en son dosya manipülatörünün çalıştırdığı yapılandırma ne olursa olsun değiştirilir. Herkesin Xcode sürümlerini tam olarak senkronize etmek yardımcı oluyor gibi görünüyor toolsVersion, ancak systemVersiongeliştiricinin çalıştırdığı belirli Mac ve / veya OS X sürümüne bağlı olarak ne olursa olsun değişir.

Bu aptalca ama çoğunlukla zararsız. Yine de bizi endişelendiren şey, diğer bazı değişikliklerin film şeridinde otomatik olarak bir git pull. Yani Alice bir storyboard'da değişiklikler yapar, bunları işleme koyar ve depoya iter. Bob daha sonra Alice'in değişikliklerini çeker ve daha fazla değişiklik yapmak için film şeridini açar. Film şeridini açtığı anda, dosya simgesi hemen değiştirilmiş ancak kaydedilmemiş bir duruma geçer vegit status herhangi bir sayıda tuhaf değişikliğin meydana geldiğini gösterir. Tüm bunlar, Bob hiçbir şeyi değiştirmeden veya dosyayı kendisi kaydetmeden.

Gördüğümüz en yaygın otomatik değişiklik <classes>, bir film şeridi dosyasının sonuna yakın tüm etiket hiyerarşisinin kaybolması veya yeniden ortaya çıkmasıdır. Buna neyin sebep olduğunu bulamadık. Çeşitli .lproj dizinlerinde bir film şeridinin birkaç yerelleştirilmiş sürümüne sahip olabiliriz ve bunları Interface Builder içinde açarken, sınıf hiyerarşisi bazılarından kendiliğinden kaldırılıp diğerlerine eklenebilir veya bazılarında yalnız bırakılabilir. Bu, çok fazla gürültüye neden olur git diff, ancak aslında herhangi bir işlevi bozmaz. Yaptığımız gerçek değişiklikleri sıklıkla seçmeli olarak git'in indeksine ekleyeceğiz, bunları uygulayacağız ve sonra sadece spontane, saçma sapan şeyleri atacağız.<classes> değişikliklerin . Bu, taahhütleri olması gerektiği gibi küçük ve güzel tutmaktır. Sonunda, yine de, Xcode değişiklikleri tekrar yapmaya devam ettiğinden ve birileri onları diğer bazı şeylerle birlikte öfkelendirdiği için uğraşmak çok fazla olur ... bu, bir başkasının Xcode'u onları hayır için değiştirmeye karar verene kadar iyidir. belirgin sebep. (Taahhüt tarihimizde bunun üzerine çok fazla küfür var.)

Bu davranışı gören başka biri var mı? Bu bir veya daha fazla geliştirici Mac'imizde bir Xcode hatası mı yoksa bir yapılandırma sorunu mu? XIB dosyalarıyla işbirliği yaparken benzer davranışlar gördük, ancak hikaye tahtaları buna daha duyarlı görünüyor.


Aslında, Xcode projeleri ve Git birlikte pek iyi gitmiyor. Gereksiz değişiklikleri atmaktan başka bir yolla bu karmaşadan kaçınabileceğinizi sanmıyorum - bunlar neredeyse her zaman proje dosyaları benim ve diğer xml dosyaları için değişir, eminim değiştirmedim. Herhangi bir 'çözüm' varsa sevinirim. Xcode'un çok fazla değişmesine izin vermeyen kullanışlı kilit işlevi için Perforce'u seviyorum, bu muhtemelen değiştirmeyeceğiniz dosyalar için manuel olarak yapılabilir, yalnızca gözden geçirmek için yapılabilir.
A-Live

3
Git veya başka bir şeyle storyboard kullanmaya değmez. Dostça davranmak için tasarlanmamıştır. Vazgeçtik ve .xib ile gittik ki bu o kadar da iyi değil ama en azından ayrıntılı.
ahwulf

Aslında pek çok şey için oldukça temiz hikaye tahtaları bulduk, ancak bunları XIB'lerle karıştırmak genellikle gerekli. Bu hata giderilirse, çoğu zaman onlarla çalışmaktan oldukça mutlu oluruz.
JK Laiho

Sadece ahwulf'un yorumu üzerine yorum yapmak zorundayım: Bu dünyada dostça davranmadıklarını kastediyor musunuz? Bunlar XML / metin dosyalarıdır, bu da alabileceğiniz kadar kolay işlenir. Ve film şeridi ve bir sürüm oluşturma sistemiyle 'hiç' sorun yaşamadım, tek sorun elbette xcode'un bazen <classes> etiketini silip daha sonra onu okuması, ancak değişikliklere bakarsanız bunu kolayca görebilirsiniz. dvcs için git GUI veya git -p veya eşdeğeri. Bu .pbxproj dosyasında bir fyi olarak hiç olmadı.
mgrandi

Sınıf dosyalarını okuyarak bu blokları oluşturabiliyorsa, xcode'un neden sınıf bloklarını hikaye panosunun içine koyduğunu anlayamıyorum? bunlar bir tür "önbellek" mi? eğer öyleyse, bir sınıflar.cache dosyasına
koyulmalılar

Yanıtlar:


78

Bu bir hata değildir, bu Xcode'un storyboard dosyalarını nasıl işlediğinin bir sonucudur. Film şeridi dosyaları için bir fark ve birleştirme programı yazıyorum (GitHub bağlantısı) ve film şeridi dosyalarının mantığını ve Xcode'un bunu nasıl işlediğini analiz etmek için saatler harcadım. Bunu keşfettim:

  • Film şeridi dosyalarında neden garip değişiklikler oluyor? Xcode, film şeridi dosyalarını bazı NSSettabanlı mantıksal ağaç yapısına ayrıştırmak için NSXML API'sini kullanır . Xcode değişiklikleri yazması gerektiğinde NSXMLDocument, mantıksal ağaç yapısına dayalı bir oluşturur , film şeridi dosyasını temizler XMLDataWithOptions:ve dosyayı yeniden doldurmak için çağrılar yapar. Setler, öğelerinin sırasını korumadığından, en ufak bir değişiklik bile film şeridi XML dosyasını değiştirebilir.

  • Sınıf etiketi neden rastgele kaybolur veya yeniden görünür? <class>Bölümde, iç Xcode cache başka bir şey değildir. Xcode, sınıflar hakkındaki bilgileri önbelleğe almak için kullanır. Önbellek sık sık değişir. Öğeler, sınıf .h/.mdosyaları açıldığında ve Xcode eski olduklarından şüphelendiğinde kaldırıldığında eklenir (en azından eski Xcodes böyle davranır). Film şeridini kaydettiğinizde, önbelleğin mevcut sürümü atılır, bu nedenle <class>bölüm sıklıkla değişir ve hatta kaybolur.

Xcode'u tersine mühendislik yapmadım; Bu gözlemleri Xcode ve storyboard dosyalarıyla deneyerek yaptım. Yine de, bu şekilde çalıştığından neredeyse% 100 eminim.

Sonuçlar :

  • Önbellek bölümü önemsizdir; içindeki herhangi bir değişikliği güvenle göz ardı edebilirsiniz.
  • Tüm forumlarda bulabileceğinizin aksine, film şeridi dosyalarını birleştirmek karmaşık bir iş değildir. Örneğin, MyController1bir film şeridi belgesinde görünüm denetleyicisini değiştirdiğinizi varsayalım . Film şeridi dosyasını açın ve buna benzer bir şey bulun <viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>. Yalnızca bu bölümde güvenli bir şekilde değişiklik yapabilir ve diğer her şeyi göz ardı edebilirsiniz. Segmentleri veya kısıtlamaları değiştirdiyseniz, “ory-XY-OBM”içinde olan her şeyi de kesin . Basit!

9
Xcode fark / birleştirme aracıyla ilgili herhangi bir güncelleme var mı? Bu topluluk için çok faydalı olacak gibi görünüyor.
Tony

1
Uygulamayı web sayfamdan edinebilirsiniz (profile bakın). Uygulama% 100 ücretsizdir.
Marcin Olawski

1
Benim için hikaye tahtalarını olabildiğince çok == XIB'leri kullanarak bölmek. Her şeyin dilimlenmiş olmasını istiyorsanız, XIB'leri kullanmak daha kolay ve daha iyi
Marcin

7
"Xcode'u tersine mühendislik yapmadım; Bu gözlemleri Xcode ve film şeridi dosyalarını deneyerek yaptım." Yani ise (sığ) ters mühendislik ve 's serin . :-)
Constantino Tsarouhas

13
"Bu bir hata değil, bu Xcode'un storyboard dosyalarını nasıl işlediğinin bir sonucudur." Saygılarımla, bu cümlenin 2. yarısı hiçbir şekilde ilkini açıklamıyor veya rasyonalize etmiyor. Bunu şu şekilde değiştiririm: "Bu bir hata. Bu, XCode'un .xib dosyalarını işleme biçiminin [n maalesef çözülmemiş ve oldukça can sıkıcı] bir sonucudur." XCode 5.x'ten 6.2'ye (bugün, 150311) .xib dosyaları, geliştirici tarafından hiçbir şekilde değiştirilmemiştir, yalnızca IB'de görüntülenmiştir, ücretsiz xml değişikliklerine maruz kalmaz. Bu, üretkenliği etkileyen büyük bir hatadır. "NBD, sadece gitte parçalarla ilgilen" gibi yanıtlar beni suskun bırakıyor.
cweekly

18

Bu, XCode 4.5+ sürümündeki bir hatadır, umarım düzelir ve evet bu bir PITA'dır.

İşte Apple'daki tam hata

Xcode film şeridi dosyalarında gereksiz düzenlemelerden nasıl kaçınılır?


1
4.6'daki aynı şey. Belki bir hata değildir.
Thromordyn

4.6.3 hala buna sahiptir. Film şeridinin / xibs'in hiç iyi çalıştığını söyleyemem
houbysoft

1
"Bu bir hata değil, bir özellik": -S
MrTJ

Bunun bir hata olduğuna dair bir kanıt yok - sinir bozucu bir evet, ancak bu Xcode'un işleri nasıl yaptığı olabilir
Thomas Watson

1
7.0.1 buna herhangi bir değişiklik getirmemiştir.
Andris Zalitis

11

Bu sorun git add -p, tümü gerçek arayüz / model / üzerinde hiçbir etkisi olmayan benzer geçici değişikliklerden muzdarip olan hikaye tahtaları, XIB'ler, Çekirdek Veri modelleri ve proje dosyaları dahil olmak üzere Xcode'un oluşturduğu herhangi bir dosyada son derece mantıklı bir şekilde kullanılmasıyla hafifletilebilir. projesi.

Görsel senaryo taslaklarında gördüğüm en yaygın önemsiz değişiklikler, sistem sürüm numaraları (bahsettiğiniz gibi) ve <classes>eksikliğini hiç görmediğim bölümün sürekli eklenmesi ve kaldırılması sorunlara neden oluyor. XIB'ler için <reference key="NSWindow"/>bu, Cocoa Touch'ta bir sınıf bile olmayan ekleme ve çıkarma işlemidir . Sadece vay canına.

Deniz gibi düşünün: hem yüksek hem de alçak bir gelgit var. Seni yıkamasına izin ver.

Ahh. Bu kadar.

Değişikliklerinizi aşamalarken bu değişiklikleri göz ardı edebilir, gereksiz değişiklikleri sıfırlayabilir ve temiz bir işlem gerçekleştirebilirsiniz.

Teknik açıdan XIB'lere göre storyboard'larda gördüğüm tek avantaj, Apple'ın FileMerge'i çakışan storyboard'ları birleştirmeyi reddetmek için henüz kısırlaştırmamış olmasıdır. (FileMerge eskiden XIB'leri birleştirebilirdi, ancak daha yeni sürümler bunu bozdu. Thxxxx çocuklar 💜 !!!)

Lütfen http://bugreporter.apple.com/ adresinde tüm bu problemlerle ilgili birçok hata bildirin ! OpenRadar'da girişler oluşturmayı unutmayın .


6

Burada başka bir cevaba değinmek çünkü bu durum çok gelişti. StoryBoard'u temsil eden XIB dosyası için XML büyük ölçüde basitleştirildi.

Ayrıca son zamanlarda mermiyi ısırdım ve Xcode'da Kaynak Kontrolü için arayüzü kullanmaya başladım. Yıllardır komut satırındayım ve orada mutluyum, ancak arayüz güzel ve taahhütleri bölmenize izin veriyor; bu, taahhütlere bağlanan bir bilet sistemi kullanıyorsanız gerçekten önemlidir.

Her neyse, bugün film şeridinde bir değişiklik olduğunu fark ettim ve yerleşik fark bana bunun belge etiketinde (systemVersion) tek bir özellik olduğunu gösterdi. Yani önemli değil.

İnsanların SB'lerin birleşme sorunları nedeniyle ekiplerinde yasaklandığını söylediği makaleler okudum. Toplam delilik. O kadar şaşırtıcılar ki, özellikle yerleşik akıllı otomatik düzenine sahip olduklarından, onları kullanmıyorsanız gerçekten kaçırıyorsunuz.


3

Bu çılgınlığın neden olduğunu bilmek yararlıdır , ancak projelerini uyarılardan uzak tutmaya inananlar ve projelerini sağlıklı bir duruma geri getirmek için sadece hızlı ve kirli bir şeyler isteyenler için:

  1. Açıkça belirtilmedikçe hiçbir şey işlemeyin.

  2. Xcode'u açın ve yeni bir storyboard oluşturun (Command + N> iOS> Kullanıcı Arayüzü> Storyboard). Varsayılan adı olarak adlandırdığını varsayacağımStoryboard.storyboard .

  3. Xcode'un ihlal ettiği film şeridini açın. Bunun olduğunu varsayacağım Base.lproj/Main.storyboard.

  4. Film şeridindeki her şeyi seçin ve kopyalayın (Command + A sonra Command + C).

  5. Storyboard.storyboard.

  6. Her şeyi kopyalayıp içine yapıştırın Storyboard.storyboard.

  7. Xcode'u kapatın.

  8. Bir terminal açın ve dizinleri deponuza değiştirin.

  9. Değiştir Main.storyboardile Storyboard.storyboard( mv Storyboard.storyboard Base.lproj/Main.storyboard).

  10. git add Base.lproj/Main.storyboard; git commit -m "Fix Xcode's insanity."

  11. project.pbxprojÜzerinden yapılan değişiklikleri dikkate almayın git checkout -- project.pbxproj. git diffDosyayı sizseniz , geçici film şeridimiz (artık mevcut olmayan) hakkında bilgi eklediğini görürsünüz.

  12. Xcode yedeklemesini açın ve uyarıların kaybolduğunu görün.

  13. Nefes almak.


0

Aynı storyboard üzerinde çalışmak sorun değil. Ancak, çekme / birleştirme konusunda çatışmalar yaratan aynı görüntü denetleyicisi üzerinde çalışmak korkutucu. Büyük bir ekip için aynı görüntü denetleyicide çalışmaktan gerçekten kaçınamayız.

İşin iyi yanı, xml yapısını anlarsak çoğu zaman aynı viewcontroller çakışmalarını çözebiliriz. Takım halinde çalışırken bunları birleştirmekte asla başarısız olmadım. Bir görüntü denetleyiciyle çalıştığınızı varsayalım. Görüntünüz şu anda boş. Lütfen kaynak kodu seçeneğinden viewcontroller'ın xml yapısına bir göz atın.

görüntü açıklamasını buraya girin

Storyboard xml, belge türü etiketi ile sınırlandırılmıştır. Film şeridindeki her şey sceneID = etiketinde bulunur. sahne etiketi her görüntü denetleyicisini tutar. Bu temeldir.

Şimdi görünüme bir UILabel ve bir UIB düğmesi ekledik. Ayrıca, öğelerin otomatik düzenini ayarlayın. Şimdi şöyle görünüyor:

görüntü açıklamasını buraya girin

Görünüm denetleyicisine bir seviye / düğme eklemek, görünümün alt görünüm etiketinin içine yeni bir kod ekledi. Aynı şey, daha fazla öğe eklenmesi veya herhangi bir UI değişikliği için geçerli olacaktır. Herhangi bir çakışmayı düzeltmek için gerçekten önemli olan etiket yapısını dikkatlice kontrol edin.

Şimdi, Homeviewcontroller storyboard adına başka bir viewcontroller ekliyoruz. Yeni bir görüntü denetleyici eklemek, sahneler etiketinin altına yeni bir sahne eklediği anlamına gelir. Şuna bak:

görüntü açıklamasını buraya girin

Bu noktada rastgele yapıyı değiştirip sorunları / uyarıları gözlemleyeceğiz. İlk viewcontroller etiket bitiş etiketini değiştirip dosyayı kaydediyoruz. Şimdi çalıştırın ve uyarıya bakın. Hata, 23. satırdan oluşturulan bitiş etiketinin doğru olmadığını söylüyor. 23. satırda, etiket kısıtlamalarının bitiş etiketi olmadan ayarlandığını görüyoruz. İşte sorun bu. Şimdi bitiş etiketini koyup projeyi oluşturuyoruz. Bitiş etiketini belirledikten sonra, film şeridini başarıyla görüntüleyebiliriz.

görüntü açıklamasını buraya girin

Herhangi bir çatışma uyarısıyla karşılaştığınızda, lütfen önceki kaynağınızla karşılaştırın ve kaynağı değiştirin. Eski / yedek kodu kaldırıyoruz, yeni kodu uygun etiket başlangıç ​​ucuyla saklarız ve her şeyi düzeltiriz.

[NB, zamanı geldiğinde yanıtı birkaç test durumu ile güncelleyeceğim]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.