2013-03-14 8 views
5

मैं आईओएस के लिए किसी प्रकार के UIView को क्लोन/डुप्लिकेट कैसे कर सकता हूं?

इसके पीछे विचार यह है कि मैं उदाहरण के लिए अंदर विभिन्न विभिन्न UI तत्वों के साथ एक UIView है,,, मान लीजिए कि मैं एक UIView डालते हैं है, और अंदर वहाँ (स्क्रीनशॉट नीचे समझाएँ कि मैं क्या करने की कोशिश कर रहा हूँ मदद करता है) हम UILabel है।

अब मैं UIView (अंदर के लेबल के साथ) को डुप्लिकेट करना चाहता हूं लेकिन किसी भी तरह से मुझे शायद लेबल में बदलाव करने की आवश्यकता है, उदा। पाठ संपत्ति बदलें।

मुझे इस तरह की कुछ चीज़ों की आवश्यकता है इसलिए मैं UIView को अच्छी तरह से देख सकने वाले सभी चीज़ों के साथ संरचना कर सकता हूं, लेकिन वास्तव में इसके विभिन्न प्रतियों के साथ अलग-अलग डेटा हैं।

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, लेकिन यह केवल एकमात्र ऐसा है जिसके साथ मैं आ सकता हूं। अगर किसी को यह कैसे करना है, या बेहतर दृष्टिकोण पर किसी भी विचार पर कोई विचार है तो मैं वास्तव में इसकी सराहना करता हूं। बहुत! Screenshot to make it easier to understand

उत्तर

6

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

यह UITableView और UITableViewCell द्वारा उपयोग किए जाने वाले पैटर्न के समान है (यह विशेष रूप से "बाल दृश्य नियंत्रकों" का उपयोग नहीं करता है, लेकिन यह इस पैटर्न का उपयोग करता है)।

पूर्ण विवरण के लिए, आईओएस के लिए व्यू कंट्रोलर प्रोग्रामिंग गाइड में "Creating Custom Container View Controllers" देखें।

ध्यान दें कि स्टोरीबोर्ड में ऑब्जेक्ट टेम्पलेट्स में एक विकल्प के रूप में "कंटेनर व्यू" शामिल है ताकि यह और भी आसान हो सके।

यदि आप निम्न स्तर की पहुंच चाहते हैं, तो आप निब फ़ाइल को लोड करने और इसके आउटलेट तार करने के लिए UINib का उपयोग करके हाथ से यह भी कर सकते हैं (और इस तरह हम आईओएस 5 से पहले ऐसा करते थे), लेकिन आज मैं इसका उपयोग करूंगा बाल दृश्य नियंत्रक।

+0

वह शानदार है! मुझे लगता है कि यह समाधान है! : डी –

+1

डिज़ाइन परिप्रेक्ष्य से, यदि इसमें एक लेबल वाला सेल है, तो इसके लिए एक अलग दृश्य नियंत्रक होने पर बहुत अधिक लगता है (शायद यही कारण है कि UITableView ऐसा नहीं करता) –

+1

मुझे लगता है कि अंतिम उत्पाद I मैं विकास कर रहा हूं 'उइलाबेल' से थोड़ा अधिक होगा। मुझे शायद उनमें से कुछ की आवश्यकता होगी, और एक 'UIImage', शायद एक या दो अन्य चीजें। –

7

मुझे व्यक्तिगत रूप से लगता है कि प्रत्येक दृश्य को अलग से बनाने और इसे आवश्यकतानुसार कॉन्फ़िगर करने का सबसे अच्छा जवाब है। आप एक ऐसा तरीका बना सकते हैं जो इसे देखने के लिए नए UIViews को कॉन्फ़िगर करता है, और इसके माध्यम से प्रत्येक दृश्य को पास करता है।

हालांकि, अगर आप वास्तव में एक UIView कॉपी करने की जरूरत है, आप उसे संग्रहीत कर सकते हैं, और फिर असंग्रहित यह:

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]]; 
UIView *myView = (UIView *)copyOfView; 
[self.view addSubview:myView]; 

आप इन का एक समूह है, तो सुनिश्चित करें कि आप उपकरण समय प्रोफाइलर उपयोग कर रहे हैं अपनी ड्राइंग दक्षता की जांच करने के लिए।

+0

इसके लिए धन्यवाद! ऐसा करने का एक बहुत अच्छा तरीका लगता है, तो बस स्पष्ट होने के लिए, आप जो कह रहे हैं वह है कि मैं अपना दृश्य बना (और कॉन्फ़िगर) करता हूं, इसे संग्रहीत करता हूं, फिर इसे अनारक्षित करता हूं? क्या आप मुझे संसाधन को लिंक कर सकते हैं या दृश्य को संग्रहीत करने के लिए कुछ कोड के साथ मेरी मदद कर सकते हैं? –

+0

उपरोक्त कोड संग्रह और अनारक्षित दोनों प्रदर्शन कर रहा है। उसी पंक्ति में "NSKeyedArchiver" और "NSKeyedUnarchiver" के उपयोग पर ध्यान दें। यह किसी भी संग्रहणीय वस्तु की गहरी प्रतिलिपि बनाने का वैचारिक तरीका है। –

+0

आह मैं देखता हूं, हाँ, अब बहुत अधिक समझ में आता है! –

0

यदि आपके अंदर केवल एक लेबल है तो स्पष्ट समाधान है कि उस लेबल के साथ एक कस्टम UIView सबक्लास होना चाहिए जो सबव्यू के रूप में जोड़ा गया है। हर बार आपको एक नए दृश्य की आवश्यकता होती है तो आप अपने कस्टम उप-वर्ग का उदाहरण बनाते हैं और लेबल टेक्स्ट सेट करते हैं। यदि आपके पास सेट करने के लिए कई चीजें हैं, जिनमें से कुछ आपके कस्टम सबक्लास दृश्यों के लिए आम हैं, तो आप प्रोटोटाइप डिज़ाइन पैटर्न का उपयोग कर सकते हैं, यह लागू करने के लिए काफी सरल है।

+0

आह शांत! हाँ यह करने का एक शानदार तरीका लगता है। इस बारे में सोचा नहीं था (अभी भी पूरी आईओएस चीज के लिए नया) मुझे लगता है कि मैं इसे आज़मा दूंगा। –

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

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