2010-10-15 5 views
25

मैं एक कस्टम विजेट बना रहा हूं जिसे मैं एकाधिक निब्स में उपयोग करना चाहता हूं। तो मैं एक नया दृश्य nib स्क्रीन 3 बना देता हूं, कुछ बटन जोड़ता हूं, और अब मेरा UIAwesomeSauce विजेट चाहता हूं।इंटरफ़ेस बिल्डर में किसी अन्य निब में कस्टम दृश्य लोड करने के लिए मुझे एक दृश्य कैसे प्राप्त हो सकता है?

यदि मैं सिर्फ एक दृश्य जोड़ता हूं और फिर कक्षा पहचान बदलता हूं, तो इसे UIAwesomeSauce nib से उप-प्राप्त नहीं मिलता है। अगर मैं लाइब्रेरी में जाता हूं और कक्षाओं में जाता हूं तो वही बात। ऐसा लगता है कि केवल एक UIViewController के पास "लोड से निब" का क्षेत्र है, जो सुंदर होगा।

मुझे पता है कि मैं कोड से UIAwesomeSauce nib लोड कर सकता हूं, शीर्ष स्तर की वस्तुओं को प्राप्त कर सकता हूं, और इसे हाथ से रख सकता हूं। लेकिन आईबी का मुद्दा यह है कि आपको चीजों को कोड में रखना नहीं है। इससे भी बेहतर होगा अगर मैं लाइब्रेरी सूची में दिखाने के लिए UIAwesomeSauce प्राप्त कर सकता हूं।

हल - निमरॉड द्वारा - विवरण और कोड

वैसे भी, Dood के लिए पढ़ते रहें, कि महान है। मैं अब मूर्खतापूर्ण सामान के लिए अपनी खुद की विजेट कक्षाएं बना सकता हूं। अपने यूआई के फाइलऑनर को अपनी कक्षा में रखें, और इसमें बस अपनी सभी सामग्री के साथ एक सामान्य UIView है। (विजेट के निब में एकल दृश्य कक्षा नहीं हो सकता है, या आप initWithCoder में रिकर्सिव प्राप्त कर सकते हैं।) फिर निब में आप इसका उपयोग करना चाहते हैं, एक वेनिला UIView बनाएं और अपनी कक्षा बदलें। आप वास्तव में उस वर्ग के अंदर विजेट को देखने में सक्षम नहीं होंगे, लेकिन सौदा करें।

स्वयं अब एक खाली दृश्य है, और tmyActualSelf एक ही दृश्य है जिसे आपने अन्य निब में काम किया है। वाह!

- (id)initWithCoder:(NSCoder*)coder 
{ 
    if ((self = [super initWithCoder:coder])) 
    { 
     UIView *tMyActualSelf = nil; 
     // Initialization code 
     NSArray *tNibItems = [[NSBundle mainBundle] loadNibNamed:@"UIAwesomeSauce" owner:self options:nil]; 
     for (id object in tNibItems) 
     { 
      if ([object isKindOfClass:[UIView class]]) 
       tMyActualSelf = (UIView *)[object retain]; 
     } 
     if(tMyActualSelf) 
     { 
      tMyActualSelf.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
      [self addSubview:tMyActualSelf]; 
     } 
    } 
    return self; 
} 

उत्तर

14

मैं अपने दर्द महसूस जब यह UIViewController केवल एक चीज आप के साथ एक निब लोड निर्दिष्ट कर सकते हैं किया जा रहा है की बात आती है, लेकिन मैं इसे क्योंकि है कि वहाँ एक फ़ाइल के मालिक एक नियंत्रक, या ऐसा ही कुछ है कि हो गया है लगता है, हालांकि मुझे यकीन नहीं है कि क्यों UIView फ़ाइल के स्वामी नहीं हो सकता है।

मुझे लगता है कि आप कस्टम ऑब्जेक्ट्स के तहत लाइब्रेरी में चीजें डाल सकते हैं, लेकिन मुझे लगता है कि आप क्लास के साथ UIView को केवल UIView के कस्टम सबक्लास पर सेट करने के लिए सीमित होंगे। मैं वास्तव में इंटरफ़ेस बिल्डर का विस्तार करने की कोशिश में देखा और ऐसा लगता है कि आप इसे ओएस एक्स सामान के लिए कर सकते हैं, लेकिन आईफोन सामान के लिए नहीं। इसमें इंटरफ़ेस बिल्डर में नए विजेट के लिए कोड संकलित करना शामिल है ताकि यह बताने के लिए कि आईबी के भीतर विजेट को कैसे आकर्षित किया जाए। मुझे लगता है कि इसके लिए वास्तव में एक ओएस एक्स टेम्पलेट है।

मुझे लगता है कि मैं शायद जो करता हूं वह एक निब फ़ाइल में मुख्य दृश्य बनाता है जिसमें सभी सबव्यूव होते हैं, फिर initWithCoder में: UIAwesomeSauce चीज़ में nib फ़ाइल खोलें, मुख्य दृश्य लोड करें, और बस इसे अंदर रखें स्वयं ताकि आपके पास UIAwesomeSauce व्यू और सबव्यूव (या उप-सबव्यूज़ के मामले के रूप में उप-दृश्य) के बीच एक "अनावश्यक" दृश्य हो। मुझे यकीन नहीं है कि यह कितना अक्षम है, लेकिन कुछ सामानों के साथ गड़बड़ करने में यह कुछ विचारों जैसा दिखता है UIWebView में इन प्रतीत होता है कि अनजान मध्यवर्ती विचारों (आईआईआरसी) में से एक है।

यदि आप एक बेहतर समाधान के साथ आते हैं तो कृपया मुझे बताएं क्योंकि मैं भी जानना चाहता हूं।

संपादित

अब जब कि मैं इसे देख, मुझे लगता है कि UIView फ़ाइल के मालिक हैं, तो आप बस इसे आईबी में स्थापित नहीं कर सकते हो सकता है। यदि आप UISpecialSauce या में आउटलेट बनाने

मुझे लगता है कि

[... बंडल loadNibNamed:: @ "UISpecialSauce" मालिक: स्वयं विकल्प] मूल रूप से आप UIView उपवर्ग में इस तरह निब लोड कुछ फोन करता हूँ जो कुछ भी उन्हें मालिक के कारण सही ढंग से सौंपा जाना चाहिए: स्वयं। https://github.com/mobilejazz/NibWrapper

यह एक आवरण दृश्य एक और निब से एक बच्चे को लोड होगा कि प्रदान करता है:

+1

यह इतना शानदार है कि मैं आपको एक पाई बनाना चाहता हूं। – CBGraham

+0

हाँ! आखिर में पोस्ट पर मतदान करने के लिए मुझे पर्याप्त अंक मिल गए, इसलिए वहां जाएं। (आप अपने प्रश्नों पर पोस्ट पर वोट करने में सक्षम होना चाहिए, जैसे कि आप अपने प्रश्नों पर पोस्ट पर टिप्पणी कर सकते हैं।) – CBGraham

+0

किसी के लिए (मेरे जैसा) जिसने प्रश्न स्कैन किया और जवाब को विस्तार से पढ़ा, पूछने वाले ने अपना "हल किया "कोड अपने मूल प्रश्न में एक संपादन के रूप में। –

1

एक cocoapod है कि वास्तव में उस के साथ मदद कर सकता है Theres। आप रनटाइम विशेषता के माध्यम से इंटरफ़ेस बिल्डर के अंदर उस एनआईबी का नाम निर्दिष्ट कर सकते हैं।

+0

धन्यवाद, मैंने आपका संदर्भ ढूंढने के बाद इसका उपयोग किया है। पढ़ने के दिनों के बाद एक बड़ी मदद थी। केवल शर्म की बात है कि एक स्तर का संकेत है क्योंकि आपको UIView प्लेसहोल्डर (क्लास UINibWraper) सेट करना है, और इससे आप अपने कस्टम UIView का संदर्भ प्राप्त कर सकते हैं। एक और कोकोपॉड है जो एक अलग दृष्टिकोण लेता है जो सिद्धांत में इस अतिरिक्त परत (UIView + NibLoading) को हटा देता है, लेकिन कस्टम दृश्य में ऑटोलायआउट बाधाओं का उपयोग करके यह मेरे लिए क्रैश हो जाता है। –

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