2011-05-01 12 views
21

मेरे पास तीन अलग-अलग UITableViews हैं, प्रत्येक के अपने दृश्य में, टैब के माध्यम से उपयोग किया जाता है। सभी तीन टेबल आदर्श रूप से एक ही कस्टम UITableViewCell क्लास और .xib फ़ाइल साझा करेंगे।एकाधिक "फ़ाइल के मालिक" के साथ एक xib फ़ाइल

मैंने एक टेबल के साथ शुरुआत की, मेरी कस्टम कक्षा में .xib की कक्षा और तालिका के मालिक को UXiewController के .xib के स्वामी को सेट करना, जो बहुत अच्छा काम करता है। सभी कस्टम व्यू-संबंधित कोड सेल की कक्षा में हैं (नियंत्रक द्वारा निर्धारित संपत्ति पर आधारित पृष्ठभूमि छवियां, कस्टम सेल ऊंचाई नियंत्रक द्वारा निर्धारित सेल प्रॉपर्टी के आधार पर लेबल की लाइनों की संख्या के आधार पर कस्टम सेल ऊंचाई) ।

परिणाम अच्छा है: सेल सभी दृश्य लेआउट के लिए ज़िम्मेदार है और सेल के नियंत्रण पर उपयोगकर्ता क्रियाओं का जवाब दे रहा है, जबकि व्यू कंट्रोलर कोशिकाओं को बनाने और उनके डेटा को सेट करने के लिए ज़िम्मेदार है।

अब मुझे अन्य तालिकाओं में सेल का पुन: उपयोग करने की आवश्यकता है, हालांकि, यह तथ्य कि कस्टम सेल का .xib एक फ़ाइल का मालिक है, एक समस्या है। .xib फ़ाइल को डुप्लिकेट करने के बजाय, क्या एकाधिक नियंत्रकों को इसके मालिक होने की अनुमति देने का एक आसान तरीका है?

+0

मुझे लगता है कि मैं आपकी समस्या का पालन नहीं कर रहा हूं 100%। क्या आप 'UITableView' की प्रतिनिधि विधि' का उपयोग कर रहे हैं - (UITableViewCell *) cellForRowAtIndexPath: (NSIndexPath *) indexPath'? – joshpaul

+0

@joshpaul हां। समस्या यह है कि अन्य व्यू कंट्रोलर के पास .xib के नियंत्रण/गुणों के पास मालिक के रूप में सेवा करने वाले किसी अन्य नियंत्रक के साथ पहुंच नहीं है। –

+0

मेरे पास मेरा कस्टम सेल का xib 'फ़ाइल का स्वामी' एनएसओब्जेक्ट पर सेट है, और 'सेल' MyCustomTableViewCell पर है। – joshpaul

उत्तर

37

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

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

+0

आह, अच्छा विचार। मुख्य मुद्दा यह है कि अन्य दृश्य नियंत्रकों को तत्काल सेल के गुणों तक कोई पहुंच नहीं थी; यह अच्छी तरह से हल करता है। धन्यवाद। –

+0

मैं थोड़ी देर के लिए इस पर काम कर रहा हूं, और मैं पतला हूं कि आप मेरे प्रश्न का उत्तर देने के बहुत करीब हैं। शायद थोड़ा सा मदद? वास्तव में आपके सुझाव का उपयोग कैसे किया जाएगा इसका एक योजनाबद्ध होगा। मैंने कोशिश की है, और एक XIB में एक ही टीवीसेल साझा करने के लिए UITableViewCell के तीन अलग-अलग उप-वर्ग नहीं प्राप्त कर सकते हैं। – mputnamtennessee

+3

@ mputnamtennessee कि आप करने में सक्षम नहीं होंगे। एक निब फ़ाइल से लोड दृश्य के वर्ग को निब द्वारा परिभाषित किया गया है। उपरोक्त उत्तर एक सामान्य निब फ़ाइल से एक ही UITableViewCell के उदाहरण लोड करने वाले विभिन्न नियंत्रक वर्गों के संदर्भ में था। यह निब से बाहर निकलने वाले वर्ग के कई उप-वर्गों को लोड करने का प्रयास करने से अलग है। आपको हल करने के लिए एक अलग समस्या प्रतीत होती है जो शायद एक नया प्रश्न खोलने लायक है। – Jonah

4

checked answer से this question एनआईबी फाइलों से कस्टम टेबल सेल लोड करने के लिए दो दृष्टिकोणों पर चर्चा करता है जिन्हें फ़ाइल के मालिक को आपके विशिष्ट नियंत्रक पर सेट करने की आवश्यकता नहीं होती है। ये दृष्टिकोण आपको विभिन्न मालिकों के साथ कोशिकाओं का पुन: उपयोग करने देते हैं।

+1

मुझे उनको इंगित करने के लिए धन्यवाद, वे जिस तरह से काम करना चाहते हैं, काम करने के लिए चीजों को ढूढ़ने के दोनों अच्छे तरीके हैं। दुर्भाग्यवश दोनों को अन्य कोड के महत्वपूर्ण पुनर्गठन की आवश्यकता होगी, जिनके पास मेरे पास समय नहीं है। मुझे यकीन है कि मैं बाद में उस विकल्प के लिए भुगतान करूंगा, हालांकि, एक प्रकार का कोड कर्म। :) –

1

फ़ाइल साझाकर्ता के रूप में एक "साझा" सुपर क्लास हमेशा एक अच्छा समाधान नहीं है। याद रखें कि आप हमेशा उदाहरण के लिए अपने ध्यान में रखते हुए xib लोड, और आउटलेट का उपयोग किए बिना कनेक्शन बना सकते हैं,:

UIView *aView = [[NSBundle mainBundle] loadNibNamed:@"MyXibFile" owner:self options:nil] 
//Search subviews by tag. Obviously you need to set the tag on your view in MyXibFile 
UILabel *aLabel = (UILabel*)[aView viewWithTag:996]; 
UILabel *aTextField = (UITextField*)[aView viewWithTag:997]; 
aTextField.delegate = self; 
//etc... 

मैं नहीं कह सकता कि यह एक साफ समाधान है, लेकिन कुछ मामलों में की तुलना में बेहतर काम कर सकता था विरासत

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