2009-02-11 17 views
11

मेरे पास एक आईफोन एप्लिकेशन है जो विभिन्न कला संपत्तियों और ध्वनियों के साथ अलग-अलग चमड़े के स्वादों में आता है, लेकिन सभी एक ही कोड।एक निब, अलग-अलग संपत्तियां। बंडल?

मुझे कई लक्ष्यों के साथ चीजें स्थापित की गई हैं, लेकिन मेरी समस्या यह है कि मुझे UIBuilder nib फ़ाइलों का एक अलग सेट होना चाहिए, प्रति लक्ष्य प्रति दृश्य, सही कला को इंगित करने के लिए सेट अप करें वह लक्ष्य

यह थोड़ा निराशाजनक है, क्योंकि अगर मैं एक निब फ़ाइल में बदलाव करता हूं, तो मुझे अन्य सभी निब फ़ाइलों में मैन्युअल रूप से वही परिवर्तन, समान कनेक्शन आदि बनाना होगा। मैंने अलग-अलग खाल के लिए अलग-अलग नामों के साथ सभी संपत्तियों को भी रखा है, इसलिए वे इस परियोजना में टकराव नहीं करते हैं। तो, अगर मैं लक्ष्य ए और बी है, मेरे पास है a_main_menu.png, b_main_menu.png ... a_FooViewController.xib, b_FooViewController.xib ... आदि

वहाँ एक निब फ़ाइल है कि संपत्ति एक ही नाम है कि के लिए अंक बनाने के लिए एक रास्ता है, लेकिन में हैं ... umm, विभिन्न बंडल? क्या यह बंडल के लिए है? मैं अपने कोड में ऐसा कुछ ठीक करने की कल्पना कर सकता हूं (शायद लोड करने से पहले एनबी में बी के लिए ए खोज और प्रतिस्थापित करें, यह पर्याप्त भी हो सकता है), हालांकि मैंने कोशिश नहीं की है, यह बदसूरत है।

यह मेरे पहले अनुप्रयोगों (हालांकि इष्टतम से दूर) के लिए एक प्रबंधनीय रणनीति थी, लेकिन जैसे ही मेरी सामग्री अधिक जटिल हो जाती है, मेरे बिल्डर फ़ाइलों को सिंक में रखना मुश्किल हो रहा है, और यह सिर्फ एक बहुत ही कठिन तरीका नहीं है काम करने के लिए। क्या Uibuilder को कुचलने और कोड में मेरे विचार बनाने से एक बेहतर तरीका है?

यह अच्छा होगा अगर यह xcode/builder स्तर पर काम करता है, तो निर्माता मेरे वर्तमान लक्ष्य का सम्मान करेगा और उस लक्ष्य के लिए कला दिखाएगा जबकि मैं काम कर रहा हूं ... लेकिन मैं इसके बिना रह सकता हूं, जैसे कि मैं रन टाइम पर कला के वर्तमान सेट का चयन कर सकता हूं, और मैं केवल निर्माता में एक सेट के साथ काम करने में सक्षम हूं। मैं इसे एक ही लक्ष्य और मैन्युअल रूप से इमारत से पहले सभी कला को प्रतिस्थापित करके निब्स के एक सेट के साथ भी कर सकता हूं, लेकिन यह बहुत अच्छा नहीं है।

सबसे अच्छी बात यह है कि अगर मैं दो रणनीतियों मिश्रण सकता है हो सकता है - अगर मैं एक लक्ष्य है कि बस अलग ढंग से बाहर रखी हो गया है कई में से एक दृश्य है कि राशि की तरह ... लेकिन वह वैकल्पिक है।

क्या मैं सही सवाल पूछ रहा हूं?

धन्यवाद!

उत्तर

1

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

गिट यह सुपर आसान बनाता है।

0

मुझे लगता है कि सबसे अच्छा विकल्प गिट की तरह कुछ उपयोग करना है।

यदि आप गिट का उपयोग करते हैं, तो आपके पास मुख्य स्रोत हो सकती है जिसमें मास्टर स्रोत कोड और तर्क होता है, और उप-शाखाएं होती हैं जिनमें आपके आवेदन के प्रत्येक विशेष स्वाद के लिए डेटा/छवियों के अलग-अलग सेट होते हैं। इस समाधान में, एक्सकोड यह भी नहीं जान पाएगा कि क्या हो रहा है।

0

मुझे लगता है कि यह देखने के लिए क्या है, और अधिक अनुकूलित करने के लिएडिडलोड है, यहां आप छवियों को पथ बदल सकते हैं।

5

ऐसा करने का एक तरीका है अपनी सभी कलाकृति को एक अलग बंडल में ले जाना और गतिशील रूप से इसे रनटाइम पर लोड करना (जैसे "मीडिया प्लग-इन")।

  • एक अलग परियोजना बनाएँ और चुनें "मैक ओएस एक्स/फ्रेमवर्क & लाइब्रेरी/बंडल।" इसे कॉल करें, कहें, media.bundle

  • इस परियोजना में अपनी सभी कलाकृति को ले जाएं।

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

आपके मुख्य प्रोजेक्ट में आपको इन दो तरीकों की आवश्यकता होगी।

+ (NSString *) bundleDirectoryFor:(NSString *) bundleName 
{ 
NSString* basePath = [[[NSBundle mainBundle] resourcePath] 
    stringByAppendingPathComponent:[NSString 
           stringWithFormat:@"%@.bundle", bundleName]]; 
return [[NSBundle bundleWithPath:basePath] resourcePath]; 
} 

+ (NSString *) resourceInBundle:(NSString *)bundleName 
         fileName:(NSString *)fileName 
{ 
NSString *bundlePath = [BundleUtils bundleDirectoryFor:bundleName]; 
return [bundlePath stringByAppendingPathComponent:fileName]; 
} 

अब हर बार जब आप अपने बंडल में कलाकृति उपयोग करना चाहते हैं, तो आप पथ सही फाइल करने के लिए के साथ प्राप्त कर सकते हैं:: आप एक BundleUtils वर्ग के अंतर्गत उन्हें स्थिर तरीकों से कर सकते हैं

NSString* imageFile = [BundleUtils resourceInBundle:@"media.bundle" 
             fileName:@"image.jpg"]; 
UIImage* image = [UIImage imageNamed:imageFile]; 

जाहिर है, नाम "media.bundle" को रनटाइम पर एक अलग के लिए प्रतिस्थापित किया जा सकता है ताकि आप अपने ऐप की ज़रूरतों के आधार पर अन्य बंडलों पर स्विच कर सकें। डाउनलोड करने योग्य सामग्री का समर्थन करने के लिए यह एक आसान तरीका है (कहें, पे-एड ऐड-ऑन के रूप में)।

एक चेतावनी: यह मानता है कि आपको कोड के माध्यम से रनटाइम पर गतिशील रूप से छवियों को लोड करने की आवश्यकता है। लेकिन आपके पास स्थिर एनआईबी फाइलें भी हैं जिनमें मीडिया एम्बेडेड है। आपको मीडिया फ़ाइल नामों को हल करने के लिए स्थिर एनआईबी फ़ाइल गतिशील विधियों का उपयोग करने का एक तरीका पता लगाना होगा। एक तरीका है MethodSwizzling का उपयोग करना और टाइपफैथ के प्रकार के उपसर्ग के साथ देखें, "मीडिया: image.png" और बंडलयूटिल विधियों का उपयोग करने के लिए उन्हें रीडायरेक्ट करें।

आईबी के साथ अपना लेआउट करने का एक और तरीका है तो इसे nib2objc का उपयोग करके ओब्जे-सी कोड में परिवर्तित करें और फिर प्लगइन बंडल तंत्र को प्रतिस्थापित करें।

उम्मीद है कि इससे मदद मिलती है।

0

यह मेरे लिए काम कर रहा है:

1 प्रोजेक्ट। 2 लक्ष्य ए, बी। ए के लिए 2 छवि फ़ोल्डर्स, बी।

एक नियंत्रक.एम और इसकी निब फ़ाइल दोनों लक्ष्यों के लिए है।

लक्ष्य ए और बी की छवियों के लिए अलग फ़ाइल सिस्टम फ़ोल्डर्स बनाएं।

एक छवि फ़ोल्डर को आयात करने के लिए आयात करें ("xy में फ़ाइलें जोड़ें" -> "लक्ष्य ए/बी में जोड़ें"), दूसरे को लक्षित करने के लिए b। सुनिश्चित करें कि आप "जोड़े गए फ़ोल्डर के लिए समूह बनाएं" विकल्प का उपयोग करें। "फ़ोल्डर संदर्भ" विकल्प का चयन न करें।

जब मैं लक्ष्य बनाते हैं, तो मुझे फ़ोल्डर से छवियों के साथ एक ऐप मिलता है; जब मैं बी के लिए निर्माण करता हूं, तो यह चित्रों के लिए फ़ोल्डर बी का उपयोग करता है।

संबंधित मुद्दे