Xcode unmodified स्टोरीबोर्ड और XIB फ़ाइलों को बदलता है


132

स्टोरीबोर्ड एक git वर्कफ़्लो परिप्रेक्ष्य से एक शाही दर्द है जब कई लोग उन पर सहयोग कर रहे हैं। उदाहरण के लिए, .storyboard फ़ाइल में एक्सएमएल का अपना शुरुआती <document>टैग होता है toolsVersionऔर systemVersionसबसे हाल की फ़ाइल मैनिपुलेटर जो भी कॉन्फ़िगरेशन होता है उसके द्वारा विशेषताएँ बदल जाती हैं। हर किसी के Xcode वर्जन को सिंक्रोनाइज़ करना ठीक-ठीक मदद करने लगता है toolsVersion, लेकिन systemVersionकोई फर्क नहीं पड़ता कि क्या मैक और / या OS X वर्जन के आधार पर डेवलपर चल रहा है।

यह मुहावरेदार है, लेकिन ज्यादातर हानिरहित है। हालाँकि, हमें इस बात की चिंता है कि अन्य समय में स्टोरीबोर्ड में कुछ अन्य बदलाव स्वतः ही हो जाते हैं, उन्हें खोलने के बाद git pull। यह कहना है, ऐलिस एक स्टोरीबोर्ड में परिवर्तन करता है, उन्हें रिपॉजिटरी में भेजता है और उन्हें धक्का देता है। बॉब फिर ऐलिस के बदलावों को खींचता है और आगे के बदलाव करने के लिए स्टोरीबोर्ड खोलता है। जिस क्षण वह स्टोरीबोर्ड खोलता है, फ़ाइल आइकन तुरंत संशोधित-लेकिन-बिना सहेजे गए स्थिति में बदल जाता है, और git statusदिखाता है कि किसी भी संख्या में अजीब परिवर्तन हुए हैं। बॉब के बिना यह सब कुछ बदल गया है या फ़ाइल को स्वयं सहेज लिया है।

सबसे आम स्वचालित परिवर्तन जो हम देख रहे हैं, वह <classes>स्टोरीबोर्ड फ़ाइल के अंत के पास पूरे टैग हिराची का गायब होना या पुन: प्रकट होना है । हमें यह पता नहीं चला है कि यह क्या कारण है। हमारे पास विभिन्न .lproj निर्देशिकाओं में एक स्टोरीबोर्ड के कई स्थानीयकृत संस्करण हो सकते हैं, और उन्हें इंटरफ़ेस बिल्डर के अंदर खोलने पर, वर्ग पदानुक्रम को कुछ से अनायास हटा दिया जा सकता है और दूसरों में जोड़ा जा सकता है, या कुछ में अकेला छोड़ दिया जा सकता है। यह बहुत शोर का कारण बनता है git diff, लेकिन यह वास्तव में किसी भी कार्यक्षमता को नहीं तोड़ता है। हम अक्सर उन चुनिंदा परिवर्तनों को जोड़ेंगे जो हमने git के इंडेक्स में किए हैं, उन लोगों को कमिट करते हैं, और फिर सहज, निरर्थक को छोड़ देते हैं<classes>परिवर्तन। यह छोटे और अच्छे को बनाए रखने के लिए है, जैसा कि उन्हें होना चाहिए। आखिरकार, हालाँकि, यह बहुत ज्यादा परेशान करता है क्योंकि Xcode बदलावों को फिर से करता रहता है, और कोई व्यक्ति उन्हें किसी अन्य सामान के साथ ही ragecommits करता है ... जो तब तक ठीक है जब तक कि किसी और का Xcode उन्हें वापस नहीं बदलना चाहता। स्पष्ट कारण। (हमारे प्रतिबद्ध इतिहास में इस पर बहुत अधिक शपथ है।)

क्या कोई और इस व्यवहार को देख रहा है? क्या यह एक Xcode बग या हमारे डेवलपर Mac में से एक या अधिक पर कॉन्फ़िगरेशन समस्या है? हमने XIB फ़ाइलों के साथ सहयोग करते समय कुछ इसी तरह का व्यवहार देखा है, लेकिन स्टोरीबोर्ड इसके लिए अतिसंवेदनशील लगते हैं।


वास्तव में Xcode प्रोजेक्ट्स और Git एक साथ बहुत अच्छा नहीं कर रहे हैं। मुझे नहीं लगता कि आप उन बदलावों को छोड़ने से बच सकते हैं जो अनावश्यक हैं - जो कि लगभग हमेशा मेरे लिए प्रोजेक्ट फाइल बदलते हैं और अन्य xml फाइलें होती हैं, मुझे यकीन है कि मैं नहीं बदला हूं। खुशी होगी अगर किसी तरह का 'समाधान' हो। मुझे लगता है कि सुविधाजनक लॉक फंक्शनालिटी के लिए पेरफोर्स को Xcode को बहुत अधिक बदलने की अनुमति नहीं है, जो शायद उन फाइलों के लिए मैन्युअल रूप से किया जा सकता है जिन्हें आप बदलने के लिए नहीं बल्कि केवल समीक्षा के लिए जा रहे हैं।
ए-लाइव

3
नहीं या कुछ और के साथ स्टोरीबोर्ड का उपयोग करने के लायक है। थे को अनुकूल बनाने के लिए नहीं बनाया गया है। हमने हार मान ली और .xib के साथ चला गया जो या तो महान नहीं है लेकिन कम से कम यह दानेदार है।
14

हमने स्टोरीबोर्ड्स को वास्तव में बहुत सारी चीजों के लिए बहुत साफ-सुथरा पाया है, हालांकि अक्सर उन्हें XIB के साथ मिलाना आवश्यक होता है। अगर यह बग कभी ठीक हो जाता है, तो हम उनके साथ काम करके बहुत खुश होंगे।
बजे जेके लाहो

मुझे सिर्फ आह्वान की टिप्पणी पर टिप्पणी करनी है: दुनिया में क्या मतलब है कि वे मित्रवत नहीं हैं? वे XML / पाठ फ़ाइलें हैं, जैसा कि आप प्राप्त कर सकते हैं के बारे में प्रतिबद्ध हैं। और मुझे स्टोरीबोर्ड और एक संस्करण प्रणाली के साथ 'कोई' समस्या नहीं हुई है, केवल समस्या यह है कि xcode कभी-कभी <क्लासेस> टैग को हटाता है और बाद में इसे पढ़ता है, लेकिन आप इसे आसानी से देख सकते हैं यदि आप परिवर्तनों को देखते हैं एक जीयूआई या जीआईटी-पी या जो भी डीवीडी के लिए बराबर है। मैं एक। के रूप में .pbxproj फ़ाइल के साथ ऐसा कभी नहीं हुआ।
मंगरैडी

मुझे समझ में नहीं आ रहा है कि क्यों xcode ने स्टोरीबोर्ड के अंदर वर्गों को ब्लॉक कर दिया है अगर वह सिर्फ उन फ़ाइलों को पढ़कर उन ब्लॉकों को उत्पन्न कर सकता है? क्या वे "कैश" का एक प्रकार हैं? यदि ऐसा है तो उन्हें एक क्लासी.चेच फ़ाइल में रखा जाना चाहिए ताकि हम इसे संस्करण से बाहर कर सकें ...
hariseldon78

जवाबों:


78

यह बग नहीं है, यह एक परिणाम है कि Xcode स्टोरीबोर्ड फ़ाइलों को कैसे संसाधित करता है। मैं स्टोरीबोर्ड फ़ाइलों (GitHub लिंक) के लिए एक अलग और मर्ज प्रोग्राम लिख रहा हूं और मैंने स्टोरीबोर्ड फ़ाइलों के तर्क का विश्लेषण करने में घंटे बिताए हैं और एक्सकोड इसे कैसे संसाधित करता है। यह वही है जो मैंने खोजा है:

  • स्टोरीबोर्ड फ़ाइलों में अजीब परिवर्तन क्यों होते हैं? Xcode NSXML API का उपयोग स्टोरीबोर्ड फ़ाइलों को कुछ- NSSetआधारित तार्किक ट्री संरचना में पार्स करने के लिए करता है । जब Xcode को परिवर्तनों को लिखने की आवश्यकता NSXMLDocumentहोती है, तो यह तार्किक ट्री संरचना के आधार पर बनाता है , स्टोरीबोर्ड फ़ाइल को साफ़ करता है और XMLDataWithOptions:फ़ाइल को फिर से भरने के लिए कॉल करता है । क्योंकि सेट उनके तत्वों के क्रम को संरक्षित नहीं करते हैं, यहां तक ​​कि थोड़ी सी भी संशोधन पूरे स्टोरीबोर्ड XML फ़ाइल को बदल सकती है।

  • क्लास टैग क्यों गायब हो जाता है या अनियमित रूप से फिर से दिखाई देता है? <class>खंड एक आंतरिक Xcode कैश से ज्यादा कुछ नहीं है। वर्गों के बारे में जानकारी कैशे करने के लिए Xcode का उपयोग करें। कैश अक्सर बदलता है। तत्वों को तब जोड़ा .h/.mजाता है जब Xcode संदिग्ध होने पर क्लास की फाइलें खोली और हटा दी जाती हैं (कम से कम पुराने Xcodes इस तरह का व्यवहार करते हैं)। जब आप स्टोरीबोर्ड को सहेजते हैं, तो कैश का वर्तमान संस्करण डंप हो जाता है, यही कारण है कि <class>अनुभाग अक्सर बदलता है या गायब भी हो जाता है।

मैंने रिवर्स-इंजीनियर Xcode नहीं किया है; मैंने Xcode और स्टोरीबोर्ड फ़ाइलों के साथ प्रयोग करके ये अवलोकन किए। फिर भी, मुझे लगभग 100% यकीन है कि यह इस तरह से काम करता है।

निष्कर्ष :

  • कैश अनुभाग महत्वहीन है; आप इसमें किसी भी परिवर्तन को सुरक्षित रूप से अनदेखा कर सकते हैं।
  • सभी मंचों पर आप जो भी पा सकते हैं उसके विपरीत, स्टोरीबोर्ड फ़ाइलों को मर्ज करना एक जटिल कार्य नहीं है। उदाहरण के लिए, मान लें कि आपने MyController1स्टोरीबोर्ड दस्तावेज़ में दृश्य नियंत्रक बदल दिया है । स्टोरीबोर्ड फ़ाइल खोलें, और ऐसा कुछ ढूंढें <viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>। आप इस अनुभाग में केवल परिवर्तनों को सुरक्षित रूप से कर सकते हैं और बाकी सभी चीजों को अनदेखा कर सकते हैं। यदि आपने सेगमेंट या बाधाओं को बदल दिया है, तो “ory-XY-OBM”अंदर जो कुछ भी है उसे भी कमिट करें । सरल!

9
Xcode पर कोई अपडेट भिन्न / मर्ज टूल? ऐसा लगता है कि यह इस समुदाय के लिए सुपर उपयोगी होगा।
टोनी

1
आप मेरे वेब पेज से एप्लिकेशन प्राप्त कर सकते हैं (प्रोफ़ाइल देखें)। ऐप 100% फ्री है।
मार्सिन ओलावस्की

1
मेरे लिए स्टोरीबोर्ड को यथासंभव विभाजित करना == XIB का उपयोग करना। यदि आप सब कुछ कटा हुआ चाहते हैं, तो XIBs का उपयोग करना आसान और बेहतर है
Marcin Olawski

7
"मैंने रिवर्स-इंजीनियर Xcode नहीं किया है; मैंने Xcode और स्टोरीबोर्ड फ़ाइलों के साथ प्रयोग करके ये टिप्पणियां की हैं।" यही कारण है कि है (उथले) रिवर्स इंजीनियरिंग, और यह शांत । :-)
कांस्टेंटिनो त्सौहास

13
"यह एक बग नहीं है, यह एक परिणाम है कि Xcode स्टोरीबोर्ड फ़ाइलों को कैसे संसाधित करता है।" सम्मानजनक रूप से, इस वाक्य का दूसरा भाग किसी भी तरह से न तो समझाता है और न ही पहले को युक्तिसंगत बनाता है। मैं इसमें संशोधन करूंगा: "यह एक बग है। यह एक [दुर्भाग्य से अनसुलझी और अत्यधिक कष्टप्रद] परिणाम है कि कैसेकोड प्रक्रिया .xib फ़ाइलों को बनाती है।" XCode 5.x से 6.2 (आज, 150311) के माध्यम से .xib फ़ाइलों को किसी भी तरह से डेवलपर द्वारा संशोधित नहीं किया जाता है, केवल आईबी में देखा जाता है, gratuitous xml परिवर्तन से ग्रस्त हैं। यह एक सकल बग है जो उत्पादकता को प्रभावित करता है। "NBD, बस सौदा w / chit in git" जैसे जवाब मुझे अवाक छोड़ देते हैं।
cweekly

18

यह XCode 4.5+ में एक बग है, मुझे आशा है कि यह ठीक हो जाएगा, और हाँ इसका PITA होगा।

यहाँ Apple पर पूरा बग है

स्टोरीबोर्ड फ़ाइलों में Xcode gratuitous संपादन से कैसे बचें?


1
4.6 में एक ही बात। शायद यह बग नहीं है।
थ्रोमोर्डिन

4.6.3 अभी भी है। कह नहीं सकते कि स्टोरीबोर्ड / xibs ने कभी भी अच्छी तरह से काम किया है
houbysoft

1
"यह एक बग नहीं है, यह एक विशेषता है": -S
MrTJ

कोई सबूत नहीं है कि यह एक बग है - एक झुंझलाहट हाँ, लेकिन यह सिर्फ हो सकता है कि कैसे Xcode सामान करता है
थॉमस वाटसन

1
7.0.1 ने इसमें कोई बदलाव नहीं किया है।
एंड्रिया ज़ैलिटिस

11

git add -pस्टोरीबोर्ड, XIBs, कोर डेटा मॉडल, और प्रोजेक्ट फ़ाइलों सहित Xcode की किसी भी जेनरेट की गई फ़ाइलों पर अत्यधिक विवेकपूर्ण उपयोग से इस मुद्दे को कुछ हद तक कम किया जा सकता है , जो सभी समान क्षणिक संशोधनों से ग्रस्त हैं जिनका वास्तविक इंटरफ़ेस / मॉडल पर कोई प्रभाव नहीं पड़ता है। परियोजना।

स्टोरीबोर्ड पर मैंने जो सबसे आम जंक परिवर्तन देखे हैं, वे सिस्टम संस्करण संख्याएं हैं (जैसा कि आप उल्लेख करते हैं) और <classes>अनुभाग के निरंतर जोड़ और निष्कासन , जिनमें से चूक मैंने कभी समस्या नहीं देखी हैं। XIBs के लिए, इसके अलावा और हटाना है <reference key="NSWindow"/>, जो कोको टच में एक वर्ग भी नहीं है। बस वाह।

इसे समुद्र की तरह समझें: एक उच्च और निम्न दोनों ज्वार है। इसे अपने ऊपर धोने दें।

आह। बस।

अपने परिवर्तनों का मंचन करते समय आप इन संशोधनों को अनदेखा कर सकते हैं, रद्दी परिवर्तनों को रीसेट कर सकते हैं, और एक क्लीन कमिट कर सकते हैं।

एक तकनीकी दृष्टिकोण से XIBs पर स्टोरीबोर्ड के साथ मैंने जो एकल लाभ देखा है वह यह है कि Apple ने अभी तक FileMerge को विवादित स्टोरीबोर्ड में विलय करने से इनकार नहीं किया है। (FileMerge XIBs को मर्ज करने में सक्षम हुआ करता था, लेकिन नए संस्करणों ने इसे तोड़ दिया। Thxxxx guys 💜 !!!)

कृपया इन सभी समस्याओं के बारे में http://bugreporter.apple.com/ पर ढेर सारी बग दर्ज करें ! और OpenRadar पर प्रविष्टियाँ बनाना न भूलें ।


6

यहां एक और जवाब पर फेंकना क्योंकि इस स्थिति में बहुत सुधार हुआ है। StoryBoard का प्रतिनिधित्व करने वाली XIB फ़ाइल के लिए XML को बहुत सरल बनाया गया है।

मैंने हाल ही में बुलेट को भी काट दिया है और स्रोत नियंत्रण में Xcode में इंटरफ़ेस का उपयोग करना शुरू कर दिया है। मैं वर्षों से कमांड लाइन पर हूं और वहां खुश हूं, लेकिन इंटरफ़ेस अच्छा है और यह आपको कमिट्स को विभाजित करने देता है, जो कि टिकटिंग सिस्टम का उपयोग करता है यदि आप कमिट्स से लिंक करते हैं।

वैसे भी, मैंने आज देखा कि स्टोरीबोर्ड पर एक बदलाव था और बिल्ट इन डिसप्ले से पता चला कि यह डॉक्यूमेंट टैग (सिस्टमवर्जन) में एक एकल विशेषता थी। तो कोई बड़ी बात नहीं।

मैंने उन लेखों को पढ़ा है जहां लोग कहते हैं कि विलय के मुद्दों के कारण एसबी को उनकी टीमों में शामिल नहीं किया गया था। कुल पागलपन। वे बहुत अद्भुत हैं, खासकर अब जब उनके पास बुद्धिमान ऑटोलैयूट बनाया गया है, तो आप वास्तव में गायब हो रहे हैं यदि आप उनका उपयोग नहीं कर रहे हैं।


3

यह जानना उपयोगी है कि यह पागलपन क्यों हो रहा है, लेकिन उन लोगों के लिए जो अपनी परियोजनाओं को चेतावनी से मुक्त रखने में विश्वास करते हैं और जो अपनी परियोजनाओं को एक स्वस्थ स्थिति में वापस लाने के लिए त्वरित और गंदे चाहते हैं:

  1. स्पष्ट रूप से निर्देश दिए जाने तक कुछ भी न करें।

  2. Xcode खोलें और एक नया स्टोरीबोर्ड बनाएं (कमांड + एन> आईओएस> यूजर इंटरफेस> स्टोरीबोर्ड)। मुझे लगता है कि आप इसे डिफ़ॉल्ट नाम कहेंगे Storyboard.storyboard

  3. स्टोरीबोर्ड खोलें जिसे Xcode ने उल्लंघन किया है। मुझे लगता है यह होगा Base.lproj/Main.storyboard

  4. स्टोरीबोर्ड पर सब कुछ चुनें और कॉपी करें (कमांड + ए तत्कालीन कमांड + सी)।

  5. खोलें Storyboard.storyboard

  6. सब कुछ कॉपी और पेस्ट करें Storyboard.storyboard

  7. Xcode बंद करें।

  8. एक टर्मिनल खोलें और निर्देशिकाओं को अपनी रिपॉजिटरी में बदलें।

  9. ( ) के Main.storyboardसाथ बदलें ।Storyboard.storyboardmv Storyboard.storyboard Base.lproj/Main.storyboard

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

  11. के project.pbxprojमाध्यम से परिवर्तन की उपेक्षा git checkout -- project.pbxproj। यदि आप git diffफ़ाइल करते हैं, तो आप देखेंगे कि इसमें हमारे अस्थायी स्टोरीबोर्ड के बारे में जानकारी जोड़ी गई है (जो अब मौजूद नहीं है)।

  12. Xcode वापस खोलें और देखें कि चेतावनी गायब हो गई है।

  13. सांस लेते हैं।


0

एक ही स्टोरीबोर्ड पर काम करना कोई समस्या नहीं है। लेकिन एक ही दृष्टिकोण पर काम करना, जो पुल / मर्ज पर टकराव पैदा करता है, भयावह है। हम वास्तव में एक बड़ी टीम के लिए एक ही दृष्टिकोण में काम करने से बच नहीं सकते।

अच्छी बात यह है कि जब हम xml संरचना को समझ लेते हैं, तो अधिकांश समय हम एक ही दृष्टिकोण को नियंत्रित कर सकते हैं। टीम में काम करने के दौरान मैं इनका विलय करने में कभी असफल नहीं हुआ। मान लीजिए कि आप एक दृश्य-नियंत्रक के साथ काम कर रहे हैं। आपका दृश्य वर्तमान में रिक्त है। कृपया, स्रोत कोड विकल्प से व्यूकंट्रोलर की xml संरचना पर एक नज़र डालें।

यहाँ छवि विवरण दर्ज करें

स्टोरीबोर्ड दस्तावेज़ प्रकार टैग द्वारा xml बाध्य है। स्टोरीबोर्ड में सब कुछ दृश्य दृश्य = टैग में होता है। दृश्य टैग में प्रत्येक दृश्य नियंत्रक होते हैं। यह मूल है।

अब हमने एक UILabel और UIButton को दृश्य में जोड़ा। तत्वों के ऑटोलैयट को भी सेट करें। अब यह लग रहा है:

यहाँ छवि विवरण दर्ज करें

व्यूकंट्रोलर में एक स्तर / बटन जोड़कर दृश्य के सबव्यू टैग के अंदर कुछ नया कोड जोड़ा गया। एक ही बात आगे तत्व वृद्धि या किसी भी यूआई परिवर्तन के लिए जाना जाएगा। टैग संरचना की सावधानीपूर्वक जांच करें जो किसी भी टकराव को ठीक करने के लिए वास्तव में महत्वपूर्ण है।

अब हम स्टोरीबोर्ड नाम Homeviewcontroller के नाम में एक और व्यू-कंट्रौलर जोड़ते हैं। एक नया दृष्टिकोण जोड़ने का मतलब है कि यह दृश्यों के तहत एक नया दृश्य जोड़ता है। इसे देखो:

यहाँ छवि विवरण दर्ज करें

इस बिंदु पर, हम संरचना को यादृच्छिक रूप से बदलेंगे और मुद्दों / चेतावनियों का निरीक्षण करेंगे। हम पहले viewcontroller लेबल एंड टैग को बदलते हैं और फ़ाइल को सहेजते हैं। अब इसे चलाएं और चेतावनी को देखें। एरर का कहना है कि एंड टैग सही नहीं है जो लाइन 23 से बनाया गया है। 23 लाइन में, हम देखते हैं कि एक लेबल बाधाएं बिना किसी अंतिम टैग के साथ सेट की गई हैं। यही समस्या है। अब हम अंतिम टैग लगाते हैं और प्रोजेक्ट बनाते हैं। एंड टैग सेट करने के बाद, हम स्टोरीबोर्ड को सफलतापूर्वक देख सकते हैं।

यहाँ छवि विवरण दर्ज करें

जब टकराव की किसी भी चेतावनी का सामना करें, तो कृपया अपने पिछले स्रोत और परिवर्तन स्रोत से तुलना करें। हम पुराने / निरर्थक कोड को हटा देते हैं, नए कोड को उचित टैग स्टार्ट-एंड के साथ रखते हैं और चीजों को ठीक करते हैं।

[एनबी, मैं समय मिलने पर कुछ और परीक्षण मामलों के साथ उत्तर अपडेट करूंगा]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.