ios - تحميل - مطورين ابل




Xcode يتغير لوحة القصة غير المعدلة وملفات XIB (4)

إن القصص المصورة هي بالأحرى ألم ملكي من وجهة نظر سير العمل git عندما يتعاون أشخاص متعددين عليها. على سبيل المثال ، يحتوي ملف XML في ملف .storyboard على أدواته الخاصة بعلامة <document> بعلامة toolsVersion ، systemVersion التي تم تغييرها من خلال أي تكوين تم تشغيل أحدث systemVersion ملف عليه. يبدو أن مزامنة إصدارات Xcode لكل شخص على وجه التحديد تساعد في استخدام toolsVersion ، ولكن التغييرات في systemVersion بغض النظر عن ذلك ، اعتمادًا على إصدار Mac و / أو OS X المحدد الذي يعمل عليه المطور.

هذا غبي ، لكنه غير ضار في الغالب. ما يقلقنا هو أنه في أوقات أخرى ، يتم إجراء بعض التغييرات الأخرى تلقائيًا على لوحة العمل من خلال فتحها بعد git pull . بعبارة أخرى ، تقوم أليس بإجراء تغييرات على لوحة العمل وتلتزم بدفعها إلى المستودع. يسحب بوب تغييرات أليس ويفتح لوحة العمل لإجراء المزيد من التغييرات. في اللحظة التي يقوم فيها بفتح لوحة العمل ، يتغير رمز الملف فورًا إلى حالة معدلة ، ولكن غير محفوظة ، وتظهر git status أن أي عدد من التغييرات الغريبة قد حدثت. كل هذا دون أن يكون بوب قد غير أي شيء أو أنقذ الملف بنفسه.

التغيير الأوتوماتيكي الأكثر شيوعًا الذي نراه هو اختفاء علامة <classes> tag hierachy الكاملة أو الظهور مرة أخرى بالقرب من نهاية ملف لوحة العمل. لم نفهم ما الذي يسبب هذا. قد يكون لدينا العديد من الإصدارات المترجمة من لوحة العمل في أدلة .lproj المختلفة ، وعند فتحها داخل Interface Builder ، قد تتم إزالة التسلسل الهرمي للطبقة تلقائيًا من البعض وإضافتها إلى الآخرين ، أو تركها بمفردها في بعضها. هذا يسبب الكثير من الضوضاء في git diff ، لكنه لا يكسر أي وظيفة. غالبًا ما نضيف بشكل انتقائي التغييرات الفعلية التي أجريناها في فهرس git ، ونرتكب هذه التغييرات ، ثم نتخلص فقط من التغييرات <classes> category <classes> التلقائية وغير المنطقية. هذا هو الحفاظ على الالتزام صغيرة وجميلة ، كما ينبغي أن تكون. في نهاية المطاف ، على الرغم من ذلك ، فإنه يصبح أكثر من أن تهتم لأن Xcode يواصل إعادة إجراء التغييرات ، ويقوم شخص ما بنشرها مع بعض الأشياء الأخرى ... وهو أمر جيد حتى يقرر Xcode شخص آخر أن يرغب في تغييرها مرة أخرى بدون سبب واضح. (إن تاريخ ارتكابنا لديه الكثير من السباب على هذا.)

هل يرى أي شخص آخر هذا السلوك؟ هل هذا خطأ Xcode أو مشكلة في التكوين على واحد أو أكثر من أجهزة Mac المطورين لدينا؟ لقد رأينا سلوكًا مشابهًا عند التعاون مع ملفات XIB ، ولكن يبدو أن القصص المصورة أكثر عرضة لذلك.


رمي على إجابة أخرى هنا لأن هذا الوضع قد تحسن بشكل كبير. تم تبسيط XML لملف XIB الذي يمثل StoryBoard إلى حد كبير.

أنا أيضا مؤخرا لدغة الرصاصة وبدأت في استخدام واجهة في Xcode للتحكم المصدر. لقد كنت في سطر الأوامر لسنوات وسعدت هناك ، لكن الواجهة لطيفة وهي تسمح لك بتقسيم الإلتزامات ، وهو أمر مهم حقاً إذا كنت تستخدم نظام التذاكر الذي يرتبط بالالتزام.

على أي حال ، لقد لاحظت اليوم أنه كان هناك تغيير في القصة المصورة وأظهرني الاختلاف الداخلي أنه سمة واحدة في علامة الوثيقة (systemVersion). لذلك ليس صفقة كبيرة.

لقد قرأت المقالات حيث يقول الناس أن SBs تم حظرها في فرقهم بسبب دمج القضايا. مجموع الجنون. انهم مدهشة جدا ، خصوصا الآن أن لديهم autolayout ذكي بنيت في ، كنت في عداد المفقودين حقا إذا كنت لا تستخدمها.


من المفيد معرفة سبب حدوث هذا الجنون ، ولكن بالنسبة لأولئك الذين يؤمنون بالاحتفاظ بمشروعاتهم خالية من التحذيرات والذين يرغبون فقط في سرعة وقذارة لإعادة مشاريعهم إلى حالة صحية:

  1. لا ترتكب أي شيء حتى يتم تعليمك صراحة.

  2. افتح Xcode وأنشئ لوحة عمل جديدة (Command + N> iOS> واجهة المستخدم> Storyboard). سأفترض أنك تسميته الاسم الافتراضي Storyboard.storyboard .

  3. افتح القصة المصورة التي انتهكت Xcode. سأفترض أن هذا هو Base.lproj/Main.storyboard .

  4. حدد ونسخ كل شيء على لوحة العمل (Command + A ثم Command + C).

  5. افتح Storyboard.storyboard .

  6. انسخ كل شيء والصقه في Storyboard.storyboard .

  7. إغلاق Xcode.

  8. افتح محطة وتغيير الدلائل إلى المستودع الخاص بك.

  9. Replace Main.storyboard with 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 عبر git checkout -- project.pbxproj . إذا قمت git diff الملف ، سترى أنه قد أضاف للتو معلومات عن لوحة العمل المؤقتة (التي لم تعد موجودة).

  12. افتح Xcode احتياطيًا وانظر إلى اختفاء التحذيرات.

  13. نفس.


هذا ليس خطأ ، وهذا هو نتيجة لكيفية معالجة Xcode ملفات لوحة العمل. أقوم بكتابة برنامج فرق ودمج لملفات لوحة العمل (رابط GitHub) وقد قضيت ساعات في تحليل منطق ملفات القصة المصورة وكيفية تعاملها مع Xcode. هذا ما اكتشفته:

  • لماذا تحدث تغييرات غريبة في ملفات لوحة العمل؟ يستخدم Xcode API NSXML لتحليل ملفات لوحة القصة إلى بعض بنية الشجرة المنطقية المستندة إلى 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” بالداخل. بسيط!

يمكن التخفيف من حدة هذه المشكلة إلى حد ما عن طريق الاستخدام الحكيم للغاية لـ git add -p على أي من الملفات التي تم إنشاؤها في Xcode ، بما في ذلك القصص المصورة و XIBs ونماذج البيانات الأساسية وملفات المشاريع ، وكلها تعاني من تعديلات عابرة مماثلة لا تؤثر على واجهة / نموذج / المشروع.

أكثر التغييرات غير المرغوب فيها شيوعًا التي رأيتها على لوحات القصص هي أرقام إصدار النظام (كما ذكرت) والإضافة المستمرة وإزالة قسم <classes> ، الذي لم أتطرق إلى أي سبب يسبب مشاكل. بالنسبة لـ XIBs ، فهي إضافة وإزالة <reference key="NSWindow"/> ، وهي ليست حتى فئة في Cocoa Touch. فقط رائع.

فكر في الأمر مثل البحر: يوجد تيار مرتفع أو منخفض. دعها تغسلك.

الخبر. هذا هو.

يمكنك تجاهل هذه التعديلات عند إجراء التغييرات ، وإعادة ضبط التغييرات غير المرغوب فيها ، وجعل التزامًا نظيفًا.

الميزة الوحيدة التي رأيتها مع القصص المصورة على XIBs من وجهة نظر تقنية هي أن Apple لم تقم بعد بحذف FileMerge لرفض دمج القصص المصورة المتضاربة. (تم استخدام FileMerge للتمكن من دمج XIBs ، لكن الإصدارات الأحدث قد كسرت ذلك. Thxxxx guys 💜 !!!)

يرجى تقديم الكثير من الأخطاء حول كل هذه المشاكل على http://bugreporter.apple.com/ ! ولا تنس إنشاء إدخالات على OpenRadar .





xib