जैसा कि मैंने इसे समझा, आप चाहते हैं:
- आईबी में एक सेल डिज़ाइन करें जिसका उपयोग कई स्टोरीबोर्ड दृश्यों में किया जा सकता है।
- उस सेल से अद्वितीय स्टोरीबोर्ड को कॉन्फ़िगर करें, सेल जिस दृश्य में है, उसके आधार पर।
दुर्भाग्य से, वर्तमान में ऐसा करने का कोई तरीका नहीं है। यह समझने के लिए कि आपके पिछले प्रयासों ने काम क्यों नहीं किया, आपको स्टोरीबोर्ड और प्रोटोटाइप टेबल व्यू सेल काम करने के तरीके के बारे में अधिक समझने की आवश्यकता है। (यदि आपको इस बात की कोई परवाह नहीं है कि ये अन्य प्रयास क्यों काम नहीं किए, तो अब छोड़ने के लिए स्वतंत्र महसूस करें। मुझे आपके लिए कोई जादुई वर्कअराउंड नहीं मिला है, यह सुझाव देने के अलावा कि आप बग दर्ज करते हैं।)
एक स्टोरीबोर्ड, संक्षेप में, .xib फ़ाइलों के संग्रह से बहुत अधिक नहीं है। जब आप एक टेबल व्यू कंट्रोलर को लोड करते हैं जिसमें एक स्टोरीबोर्ड से कुछ प्रोटोटाइप सेल होते हैं, तो यहां क्या होता है:
- प्रत्येक प्रोटोटाइप सेल वास्तव में अपने स्वयं के एम्बेडेड मिनी-निब है। इसलिए जब टेबल व्यू कंट्रोलर लोड हो रहा होता है, तो यह प्रत्येक प्रोटोटाइप सेल के निब और कॉल से चलता है
-[UITableView registerNib:forCellReuseIdentifier:]
।
- तालिका दृश्य कोशिकाओं के लिए नियंत्रक से पूछता है।
- आप शायद फोन करें
-[UITableView dequeueReusableCellWithIdentifier:]
जब आप किसी दिए गए पुन: उपयोग करने वाले पहचानकर्ता के साथ एक सेल का अनुरोध करते हैं, तो यह जांचता है कि क्या यह एक निब पंजीकृत है। यदि ऐसा होता है, तो यह उस सेल का एक उदाहरण बताता है। यह निम्नलिखित चरणों से बना है:
- सेल के वर्ग को देखें, जैसा कि सेल के निब में परिभाषित किया गया है। पुकारते हैं
[[CellClass alloc] initWithCoder:]
।
-initWithCoder:
विधि के माध्यम से चला जाता है और कहते हैं subviews और सेट गुण है कि निब में परिभाषित किया गया। ( IBOutlet
शायद यहाँ भी आदी हो, हालाँकि मैंने इसका परीक्षण नहीं किया है; ऐसा हो सकता है -awakeFromNib
)
आप अपने सेल को कॉन्फ़िगर करते हैं, हालांकि आप चाहते हैं।
यहां ध्यान देने वाली महत्वपूर्ण बात यह है कि सेल की कक्षा और कोशिका की दृश्य उपस्थिति के बीच अंतर है । आप एक ही कक्षा के दो अलग-अलग प्रोटोटाइप सेल बना सकते हैं, लेकिन उनके सबव्यू के साथ पूरी तरह से अलग तरीके से रखी गई हैं। वास्तव में, यदि आप डिफ़ॉल्ट UITableViewCell
शैलियों का उपयोग करते हैं, तो वास्तव में यही हो रहा है। "डिफ़ॉल्ट" शैली और "उपशीर्षक" शैली, उदाहरण के लिए, दोनों एक ही UITableViewCell
वर्ग द्वारा दर्शाए गए हैं ।
यह महत्वपूर्ण है : सेल के वर्ग में एक विशेष दृश्य पदानुक्रम के साथ एक-से-एक सहसंबंध नहीं होता है । दृश्य पदानुक्रम पूरी तरह से उस प्रोटोटाइप सेल में निर्धारित होता है जो इस विशेष नियंत्रक के साथ पंजीकृत था।
नोट, साथ ही, कि सेल का पुन: उपयोग करने वाला पहचानकर्ता कुछ वैश्विक सेल औषधालय में पंजीकृत नहीं था। पुन: उपयोग पहचानकर्ता केवल एक UITableView
उदाहरण के संदर्भ में उपयोग किया जाता है ।
इस जानकारी को देखते हुए, आइए देखें कि आपके उपरोक्त प्रयासों में क्या हुआ।
नियंत्रक # 1 में, एक प्रोटोटाइप सेल जोड़ा, वर्ग को मेरे UITableViewCell उपवर्ग में सेट किया, पुन: उपयोग आईडी सेट किया, लेबल जोड़े और उन्हें वर्ग के आउटलेट में वायर्ड किया। नियंत्रक # 2 में, एक खाली प्रोटोटाइप सेल जोड़ा, इसे उसी कक्षा में सेट करें और पहले की तरह आईडी का पुन: उपयोग करें। जब यह चलता है, तो कक्ष कभी भी दिखाई नहीं देते हैं जब कक्ष नियंत्रक # 2 में दिखाए जाते हैं। नियंत्रक # 1 में ठीक काम करता है।
यह अपेक्षित है। जबकि दोनों कोशिकाओं में एक ही वर्ग था, दृश्य पदानुक्रम जो कि नियंत्रक # 2 में सेल को पास किया गया था, पूरी तरह से साक्षात्कार से रहित था। तो आपको एक खाली सेल मिला, जो कि आपने प्रोटोटाइप में डाला है।
प्रत्येक सेल प्रकार को एक अलग एनआईबी में डिज़ाइन किया गया है और उपयुक्त सेल क्लास तक वायर्ड किया गया है। स्टोरीबोर्ड में, एक खाली प्रोटोटाइप सेल जोड़ा और अपनी कक्षा सेट की और मेरे सेल वर्ग को संदर्भित करने के लिए आईडी का पुन: उपयोग किया। नियंत्रकों के दृष्टिकोण में, डिडलॉवड के तरीकों, पुन: उपयोग आईडी के लिए उन NIB फ़ाइलों को पंजीकृत किया। जब दिखाया गया है, दोनों नियंत्रकों में कोशिकाएं प्रोटोटाइप की तरह खाली थीं।
फिर, यह अपेक्षित है। पुन: उपयोग पहचानकर्ता स्टोरीबोर्ड दृश्यों या nibs के बीच साझा नहीं किया जाता है, इसलिए तथ्य यह है कि इन सभी अलग-अलग कोशिकाओं के समान पुन: उपयोग पहचानकर्ता व्यर्थ था। टेबलव्यू से वापस मिलने वाले सेल में एक रूप होगा जो स्टोरीबोर्ड के उस दृश्य में प्रोटोटाइप सेल से मेल खाता है।
यह समाधान हालांकि करीब था। जैसा कि आपने उल्लेख किया है, आप बस प्रोग्राम को कॉल कर सकते हैं -[UITableView registerNib:forCellReuseIdentifier:]
, UINib
जिसमें सेल शामिल है, और आप उसी सेल को वापस प्राप्त करेंगे। (यह नहीं है क्योंकि प्रोटोटाइप नीब को "ओवरराइडिंग" कर रहा था; आपने बस निब को टेबलव्यू के साथ पंजीकृत नहीं किया था, इसलिए यह अभी भी स्टोरीबोर्ड में एम्बेडेड निब को देख रहा था।) दुर्भाग्य से, इस दृष्टिकोण के साथ एक दोष है। स्टोरीबोर्ड सेगमेंट को एक स्टैंडअलोन निब में सेल में हुक करने का कोई तरीका नहीं है।
दोनों नियंत्रकों में खाली और सेट क्लास में प्रोटोटाइप रखे और मेरे सेल क्लास में आईडी का पुन: उपयोग करें। पूरी तरह से कोड में कोशिकाओं के यूआई का निर्माण किया। सेल सभी नियंत्रकों में पूरी तरह से काम करते हैं।
सहज रूप में। उम्मीद है, यह आश्चर्यजनक है।
तो, इसीलिए यह काम नहीं किया। आप स्टैंडअलोन निब में अपनी कोशिकाओं को डिज़ाइन कर सकते हैं और उन्हें कई स्टोरीबोर्ड दृश्यों में उपयोग कर सकते हैं; आप वर्तमान में उन कक्षों पर स्टोरीबोर्ड सेगमेंट को हुक नहीं कर सकते। उम्मीद है, हालांकि, आपने इसे पढ़ने की प्रक्रिया में कुछ सीखा है।