8

डीकोड किया गया है मेरे पास UICollectionViewCell का सबक्लास है। सेल स्टोरीबोर्ड में कई घटकों के साथ दृश्यमान रूप से डिज़ाइन किया गया है और ये घटक स्टोरीबोर्ड का उपयोग करके स्विफ्ट उपclass में चर के लिए बाध्य हैं।UICollectionViewCell में बाइंडिंग को पुनर्स्थापित कैसे करें इसे

स्विफ्ट क्लास डेटा स्रोत से पुनर्प्राप्त डेटा से घटकों को पॉप्युलेट करने के लिए तर्क प्रदान करता है।

उदाहरण के लिए:

class InfoCollectionViewCell : UICollectionViewCell { 

    @IBOutlet weak var mainPanel : UIView! 
    @IBOutlet weak var panel1 : UIView! 

    @IBOutlet weak var firstName : UILabel! 
    @IBOutlet weak var lastName : UILabel! 
    @IBOutlet weak var address : UILabel! 
    etc ... 

    func setVariousProperties(etc) { 
     firstName.text = ... etc 

डेटा स्रोत है सामान्य बात:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
if let c : InfoCollectionViewCell = cell as? InfoCollectionViewCell { 
    c.setVariousProperties(...) 
} 

मैं मूल रूप से केवल कार्यान्वित डिकोड/एनकोड एक "लागू नहीं किया" अभिकथन युक्त तरीकों, लेकिन यह स्पष्ट हो गया कभी-कभी ढांचा वर्ग को एन्कोडिंग और डीकोडिंग करता था। मैंने घटकों को सहेजे बिना डमी एन्कोड/डिकोड विधियों को कार्यान्वित किया जिसके परिणामस्वरूप घटकों तक पहुंचने पर शून्य मूल्यों के साथ अनुमानित समस्याएं हुईं।

तो ऐसा प्रतीत होता है कि मुझे UICollectionViewCell उप-वर्ग में सभी नियंत्रणों के एन्कोडिंग और डिकोडिंग को लागू करने की आवश्यकता है, या मुझे एक बेहतर तरीका मिलना है।

ऐसा लगता है कि मुझे वास्तव में आवश्यकता नहीं है (मुझे नहीं लगता) घटकों की सामग्री को बचाने के लिए, क्योंकि वे सबक्लास द्वारा किसी भी तरह से फिर से उपयोग के लिए होने जा रहे हैं: मैं ओवरराइट करूँगा घटक सामग्री डेटा स्रोत से मूल्यवान होगा।

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

क्या कोई बेहतर तरीका है?

क्या मैं बस "कनेक्शन पुनर्स्थापित" या ऐसा कुछ कह सकता हूं?

संपादित करें:

प्रश्न पोस्ट करने और इनाम जोड़ने के बीच कहीं न कहीं, समस्या हो रहा बंद कर दिया। अब मुझे पता है कि मेरे घटकों की एन्कोड विधि को कॉल नहीं किया जा रहा है। तो किसी कारण से, ढांचा मेरी वस्तुओं को क्रमबद्ध करने और उन्हें deserialise करने का फैसला कर रहा था, लेकिन अब यह नहीं है। इसलिए समस्या नहीं हो रही है और मैं एक स्टैक-ट्रेस की आपूर्ति करने में सक्षम नहीं हूं।

यह कल्पना की जा सकती है कि एक्सकोड के कुछ अपडेट ने इस समस्या को ठीक कर दिया है, या यह कुछ और हो सकता है।

मुझे स्पष्ट रूप से अभी भी चिंता है कि वहां कुछ बग वहां छिपी हुई है।

+0

किसी को भी समस्या आ रही? मैं टिप्पणियों की सराहना करता हूं। – rghome

उत्तर

2

आपको स्टोरीबोर्ड में रखे गए और जुड़े किसी भी नियंत्रण के लिए एन्कोडिंग/डिकोडिंग लागू करने की आवश्यकता नहीं है। इसे रनटाइम पर ख्याल रखा जाएगा और collectionView.dequeueReusableCellWithReuseIdentifier के बाद आपको सेल वापस मिल जाएगा जब तक कि सबकुछ यूआई घटकों के उपयोग के लिए तैयार नहीं हो जाता है।बातों की जांच करने के लिए कर रहे हैं:

  1. उपवर्ग स्टोरीबोर्ड कस्टम वर्ग खंड में निर्दिष्ट किया जाता है
  2. reuseIdentifier स्ट्रिंग जैसा कि आप उम्मीद
  3. सभी IBOutlets जुड़े हुए हैं और यह भी में कनेक्शन दिखाना चाहिए मैच के लिए परिभाषित किया गया है आईबीओलेटलेट वैर लाइनों के बगल में कोड।

एक बार जब आप सुनिश्चित किया है इन कर रहे हैं सही घटकों को प्रिंट अगर वे अब भी नहीं के बराबर हैं जाँच करने के लिए और किसी भी डेटा स्रोत समस्याओं को खत्म करने वहाँ में कुछ साधारण पाठ रखने की कोशिश: और

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
    if let c = cell as? InfoCollectionViewCell{ 
     print(c.address) 
     print(c.firstName) 
     print(c.lastName) 

     c.firstName.text = "firstName Test" 
     c.lastName.text = "lastName Test" 
     c.address.text = "address Test" 
    } 
    return cell 
    } 
} 
+0

ठीक है - धन्यवाद। मैं थोड़ा और जांच करूंगा। – rghome

+0

बेशक, मैं इसे पुन: पेश नहीं कर सकता। यह एक समस्या थी जो एक स्क्रॉल निष्पादित होने पर 100 कोशिकाओं के साथ एक दृश्य पर काफी आसानी से पुन: उत्पन्न किया गया था, लेकिन कम कोशिकाओं के साथ विचारों पर नहीं, बल्कि पहली स्क्रीन पर दिखाया गया था। मैं कोशिकाओं के कुछ धारावाहिक serialization लगता है। अब यह मुझे परेशान करता है कि वहां एक अड़चन बग है, क्योंकि आपके द्वारा किए गए सभी सुझावों को वैसे भी लागू किया जाना चाहिए, अन्यथा मेरे पास काम करने वाली कोशिकाओं की पहली स्क्रीन नहीं थी। मुझे मिली त्रुटियों ने स्पष्ट रूप से दिखाया कि init (कोडर) को बुलाया जा रहा था और स्पष्ट रूप से कि डीकोड के बाद आईबीओटलेट को तार नहीं दिया जा रहा था। – rghome

+0

मैं यह सही जवाब होना चाहता हूं। मुझे विश्वास नहीं है कि यह है। जैसा कि मैंने उपरोक्त कहा है, एनकोड/डिकोड कॉल अज्ञात कारणों से हो रहा है। भले ही यह आईओएस (या सिम्युलेटर में) के कुछ संस्करणों में एक बग था, मैं यह सुनिश्चित नहीं कर सकता कि यह सभी उपकरणों पर तय है। ऐसा लगता है कि यह सर्वोत्तम रणनीति है कि इसे सुरक्षित और डीकोड को कार्यान्वित करें और सभी घटकों के लिए एन्कोड करें। – rghome

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