1/12/2016 अपडेट करें : यह 2016 है और मैं अभी भी अपने यूआई को कोड में रखना पसंद करता हूं और स्टोरीबोर्ड में नहीं। कहा जा रहा है, स्टोरीबोर्ड ने एक लंबा सफर तय किया है। मैंने इस पोस्ट से उन सभी बिंदुओं को हटा दिया है जो केवल 2016 में अब लागू नहीं होते हैं।
अपडेट 4/24/2015 : दिलचस्प बात यह है कि Apple ने हाल ही में खुले- खट्टे शोध में स्टोरीबोर्ड का उपयोग नहीं किया है क्योंकि पीटर स्टेनगर ने देखा है ("इंटरफ़ेस बिल्डर" के अधीन है)।
अद्यतन 6/10/2014 : जैसा कि अपेक्षित था, ऐप्पल स्टोरीबोर्ड और एक्सकोड में सुधार करता है। कुछ बिंदु जो आईओएस 7 और नीचे लागू होते हैं, वे अब आईओएस 8 पर लागू नहीं होते हैं (और अब इस तरह के रूप में चिह्नित हैं)। इसलिए जब स्टोरीबोर्ड में स्वाभाविक रूप से अभी भी खामियां हैं, तो मैं अपनी सलाह को संशोधित करता हूं कि वह चयन करने के लिए उपयोग न करें जहां यह समझ में आता है ।
अब भी है कि iOS 9 बाहर है, मैं सलाह दूंगा विरुद्धस्टोरीबोर्ड का उपयोग करने का निर्णय लेते समय सावधानी बरतने के लिए। यहाँ मेरे कारण हैं:
स्टोरीबोर्ड रनटाइम में विफल रहता है, संकलन समय पर नहीं : आपके पास एक सेगू नाम में टाइपो है या इसे आपके स्टोरीबोर्ड में गलत जोड़ा गया है? यह रनटाइम में उड़ जाएगा। आप एक कस्टम UIViewController उपवर्ग का उपयोग करते हैं जो आपके स्टोरीबोर्ड में अब मौजूद नहीं है? यह रनटाइम में उड़ जाएगा। यदि आप कोड में ऐसी चीजें करते हैं, तो आप उन्हें संकलन समय के दौरान जल्दी पकड़ लेंगे। अपडेट : मेरा नया टूल स्टोरीबोर्ड अधिकांशतः इस समस्या को हल करता है।
स्टोरीबोर्ड तेजी से भ्रामक हो जाते हैं : जैसे-जैसे आपकी परियोजना बढ़ती है, आपके स्टोरीबोर्ड को नेविगेट करने में अधिक मुश्किल होती जाती है। इसके अलावा, यदि एकाधिक दृश्य नियंत्रकों के पास कई अन्य दृश्य नियंत्रकों के लिए कई तर्क हैं, तो आपका स्टोरीबोर्ड जल्दी से स्पेगेटी के कटोरे की तरह दिखाई देने लगता है और आप अपने आप को ज़ूम इन और आउट ज़ूम कर सकते हैं और उस जगह पर स्क्रॉल कर सकते हैं, जिसे आप देख रहे हैं। के लिए और यह पता लगाने के लिए कि कौन से अंक कहाँ हैं। अपडेट : यह समस्या ज्यादातर आपके स्टोरीबोर्ड को कई स्टोरीबोर्ड में विभाजित करके हल की जा सकती है, जैसा कि पिल्की के इस लेख और रॉबर्ट ब्राउन के इस लेख में वर्णित है ।
स्टोरीबोर्ड एक टीम में काम करना कठिन बनाते हैं : क्योंकि आपके पास आमतौर पर आपके प्रोजेक्ट के लिए केवल एक विशाल स्टोरीबोर्ड फ़ाइल होती है, जिससे कई डेवलपर्स नियमित रूप से उस एक फाइल में बदलाव करते हैं, जो एक सिरदर्द हो सकता है: परिवर्तन को मर्ज करने की आवश्यकता होती है और टकराव का समाधान होता है। जब कोई विरोधाभास होता है, तो यह बताना कठिन होता है कि इसे कैसे हल किया जाए: Xcode स्टोरीबोर्ड XML फ़ाइल बनाता है और इसे वास्तव में इस लक्ष्य को ध्यान में रखते हुए डिज़ाइन नहीं किया गया था कि मानव को पढ़ना होगा, अकेले इसे संपादित करें।
स्टोरीबोर्ड्स कोड की समीक्षा को कठिन या लगभग असंभव बनाते हैं : आपकी टीम पर पीयर कोड की समीक्षा एक बहुत अच्छी बात है। हालाँकि, जब आप स्टोरीबोर्ड में बदलाव करते हैं, तो एक अलग डेवलपर के साथ इन परिवर्तनों की समीक्षा करना लगभग असंभव है। आप बस इतना कर सकते हैं कि एक बड़ी XML फ़ाइल का एक हिस्सा है। यह तय करना कि वास्तव में क्या बदल गया है और यदि वे परिवर्तन सही हैं या यदि उन्होंने कुछ तोड़ दिया है तो वास्तव में कठिन है।
स्टोरीबोर्ड्स का कोड पुन : उपयोग होता है : मेरी iOS परियोजनाओं में, मैं आमतौर पर एक ऐसा वर्ग बनाता हूं जिसमें सभी रंग और फोंट और मार्जिन और इनसेट होते हैं जो मैं इसे एक सुसंगत रूप देने और महसूस करने के लिए ऐप में उपयोग करता हूं: यदि मुझे करना है तो यह एक पंक्ति परिवर्तन है। पूरे ऐप के लिए उन मानों में से कोई भी समायोजित करें। यदि आप स्टोरीबोर्ड में ऐसे मान सेट करते हैं, तो आप उन्हें डुप्लिकेट करते हैं और जब आप उन्हें बदलना चाहते हैं तो हर एक घटना को खोजने की आवश्यकता होगी। संभावना अधिक है कि आप एक को याद करते हैं, क्योंकि स्टोरीबोर्ड में कोई खोज और प्रतिस्थापन नहीं है।
स्टोरीबोर्ड को लगातार संदर्भ स्विच की आवश्यकता होती है : मैं खुद को काम करते हुए पाता हूं और स्टोरीबोर्ड की तुलना में कोड में बहुत तेजी से नेविगेट करता हूं। जब आपका ऐप स्टोरीबोर्ड का उपयोग करता है, तो आप लगातार अपना संदर्भ बदलते हैं: "ओह, मुझे एक अलग व्यू कंट्रोलर लोड करने के लिए इस टेबल व्यू सेल पर एक टैप चाहिए। मुझे अब स्टोरीबोर्ड खोलना होगा, सही व्यू कंट्रोलर ढूंढना होगा, एक नया सेगमेंट बनाना होगा। अन्य दृश्य नियंत्रक (जिसे मुझे भी ढूंढना है), सेग को एक नाम दें, उस नाम को याद रखें (मैं स्टोरीबोर्ड में स्थिरांक या चर का उपयोग नहीं कर सकता), कोड पर वापस स्विच करें और मुझे आशा है कि मैं नाम का गलत अनुमान नहीं लगाऊंगा मेरी तैयारी विधि के लिए यह तर्क है। मैं चाहता हूं कि मैं कोड की उन 3 पंक्तियों को यहीं टाइप करूं जहां मैं हूं! " नहीं, यह मजेदार नहीं है। कोड और स्टोरीबोर्ड (और कीबोर्ड और माउस के बीच) के बीच स्विच करना पुराना तेज़ हो जाता है और आपको धीमा कर देता है।
स्टोरीबोर्ड रिफ्लैक्टर के लिए कठिन हैं : जब आप अपने कोड को रिफलेक्टर करते हैं, तो आपको यह सुनिश्चित करना होगा कि यह अभी भी मेल खाता है कि आपका स्टोरीबोर्ड क्या उम्मीद करता है। जब आप अपने स्टोरीबोर्ड में चीजों को घुमाते हैं, तो आप केवल रनटाइम पर पता लगाएंगे यदि यह अभी भी आपके कोड के साथ काम करता है। यह मुझे ऐसा लगता है जैसे मुझे दो दुनियाओं को सिंक में रखना है। यह भंगुर लगता है और मेरी विनम्र राय में परिवर्तन को हतोत्साहित करता है।
स्टोरीबोर्ड कम लचीले हैं : कोड में, आप मूल रूप से कुछ भी कर सकते हैं जो आप चाहते हैं! स्टोरीबोर्ड के साथ आप एक उपसमूह तक सीमित हैं जो आप कोड में कर सकते हैं। खासकर जब आप एनिमेशन और बदलाव के साथ कुछ उन्नत चीजें करना चाहते हैं, तो आप इसे काम करने के लिए खुद को "स्टोरीबोर्ड से लड़" पाएंगे।
स्टोरीबोर्ड आपको विशेष दृश्य नियंत्रकों के प्रकार को बदलने की अनुमति नहीं देते हैं : आप एक UITableViewController
में बदलना चाहते हैं UICollectionViewController
? या एक मैदान में UIViewController
? स्टोरीबोर्ड में संभव नहीं। आपको पुराने दृश्य नियंत्रक को हटाना होगा और एक नया बनाना होगा और सभी सेगमेंट को फिर से जोड़ना होगा। कोड में इस तरह का बदलाव करना बहुत आसान है।
स्टोरीबोर्ड आपकी परियोजना में दो अतिरिक्त देनदारियों को जोड़ता है : (1) स्टोरीबोर्ड संपादक उपकरण जो स्टोरीबोर्ड एक्सएमएल और (2) रनटाइम घटक को उत्पन्न करता है जो एक्सएमएल को पार्स करता है और इससे यूआई और नियंत्रक ऑब्जेक्ट बनाता है। दोनों भागों में बग हो सकते हैं जिन्हें आप ठीक नहीं कर सकते।
स्टोरीबोर्ड आपको एक सबव्यू जोड़ने की अनुमति नहीं देता हैUIImageView
: कौन जानता है कि क्यों।
स्टोरीबोर्ड आपको व्यक्तिगत दृश्य (-कंट्रोलर) के लिए ऑटो लेआउट को सक्षम करने की अनुमति नहीं देता है : स्टोरीबोर्ड में ऑटो लेआउट विकल्प की जांच / अनचेक करके, स्टोरीबोर्ड में परिवर्तन को सभी नियंत्रकों पर लागू किया जाता है। (इस बिंदु के लिए सावा मज़ेरे को धन्यवाद!)
स्टोरीबोर्ड में पीछे की ओर संगतता को तोड़ने का एक उच्च जोखिम है : Xcode कभी-कभी स्टोरीबोर्ड फ़ाइल स्वरूप को बदल देता है और किसी भी तरह से गारंटी नहीं देता है कि आप स्टोरीबोर्ड फ़ाइलों को खोलने में सक्षम होंगे जो आप आज से कुछ साल या महीने बाद भी बनाते हैं। (इस बिंदु के लिए विचार-विमर्श के लिए धन्यवाद। मूल टिप्पणी देखें )
स्टोरीबोर्ड आपके कोड को और अधिक जटिल बना सकता है: जब आप कोड में अपना व्यू कंट्रोलर बनाते हैं, तो आप init
उदाहरण के लिए कस्टम तरीके बना सकते हैं initWithCustomer:
। इस तरह, आप customer
अपने दृश्य नियंत्रक के अंदर को अपरिवर्तनीय बना सकते हैं और सुनिश्चित कर सकते हैं कि यह दृश्य नियंत्रक बिना किसी customer
ऑब्जेक्ट के नहीं बनाया जा सकता है । स्टोरीबोर्ड का उपयोग करते समय यह संभव नहीं है। आपको prepareForSegue:sender:
कॉल की जाने वाली विधि का इंतजार करना होगा और फिर आपको customer
अपने व्यू कंट्रोलर पर प्रॉपर्टी सेट करनी होगी , जिसका मतलब है कि आपको यह प्रॉपर्टी म्यूट करनी होगी और आपको व्यू कंट्रोलर को बिना customer
ऑब्जेक्ट के बनाने की अनुमति देनी होगी । मेरे अनुभव में यह आपके कोड को बहुत जटिल कर सकता है और आपके ऐप के प्रवाह के बारे में तर्क करना कठिन बनाता है। 9/9/16 अपडेट करें: क्रिस डज़ोम्बक ने लिखा थाइस समस्या के बारे में महान लेख ।
यह मैकडॉनल्ड्स है : इसे माइक्रोसॉफ्ट के बारे में स्टीव जॉब्स के शब्दों में कहें: यह मैकडॉनल्ड्स (वीडियो) है !
ये मेरे कारण हैं कि मुझे स्टोरीबोर्ड के साथ काम करना क्यों पसंद नहीं है। इनमें से कुछ कारण XIB पर भी लागू होते हैं। स्टोरीबोर्ड-आधारित परियोजनाओं पर जो मैंने काम किया है, उन्होंने मुझे जितना समय बचाया है, उससे कहीं अधिक समय खर्च किया है और उन्होंने चीजों को आसान बनाने के बजाय अधिक जटिल बना दिया है।
जब मैं कोड में अपना UI और एप्लिकेशन प्रवाह बनाता हूं, तो जो कुछ चल रहा है, उस पर मेरा नियंत्रण है, डिबग करना अधिक आसान है, गलतियों को जल्दी से सुलझाना आसान है, अन्य डेवलपर्स के लिए मेरे परिवर्तनों को समझाना आसान है और यह iPhone और iPad का समर्थन करना आसान है।
हालाँकि, मैं इस बात से सहमत हूँ कि कोड में आपके सभी UI को रखना हर परियोजना के लिए एक आकार-फिट-सभी समाधान नहीं हो सकता है। यदि आपका iPad UI कुछ स्थानों पर आपके iPhone UI से बहुत भिन्न है, तो यह उन क्षेत्रों के लिए XIB बनाने के लिए समझ में आता है।
ऊपर उल्लिखित समस्याओं का एक बहुत कुछ Apple द्वारा तय किया जा सकता है और मुझे आशा है कि वे यही करेंगे।
केवल मेरे दो सेंट्स।
अपडेट : Xcode 5 में, Apple ने बिना स्टोरीबोर्ड के प्रोजेक्ट बनाने का विकल्प छीन लिया। मैंने एक छोटी सी स्क्रिप्ट लिखी है जो Xcode 4 के टेम्प्लेट (स्टोरीबोर्ड-ऑप्ट-आउट विकल्प के साथ) Xcode 5 को पोर्ट करता है: https://github.com/jfahrenkrug/Xcode4templates