UICollectionViewCell का आउटलेट नील क्यों है?


143

मैंने इंटरफ़ेस बिल्डर में एक कस्टम UICollectionViewCell बनाया है, क्लास पर इस पर विचारों को बाँधा है, और फिर जब मैं स्ट्रिंग पर लेबल के लिए एक स्ट्रिंग का उपयोग करना और सेट करना चाहता हूं, तो tha लेबल में शून्य मान होता है।

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

और उपवर्ग सेल:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}

क्या कोई कारण है जो आप स्पष्ट उपयोग कर रहे हैं "!" हर जगह नाम टाइप करने के अलावा? बेमानी लगता है, IBOutlets में esp। एकमात्र जगह यह बात हो सकती है कि आप सेल को लेमेनमेनकोलिऑन व्यू व्यू के रूप में कैसे हटा सकते हैं, लेकिन आप इसे वहां नहीं करते हैं .. क्या आप स्वयं प्रिंटलाइन या एनएसएलओजी 'सेल' कर सकते हैं?
mc01

1
अगर मैं हटाऊं "!" या "?" वर्ग परिभाषा में, मुझे संकलक त्रुटि या दुर्घटना मिलती है। "!" डिफ़ॉल्ट है जब आप इसे बांधते हैं।
जांनोस

चींटी सेल ही: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; फ्रेम = (0 0; 180 50); परत = <CALayer: 0x7aa6f810 >>
János

सभी आउटलेट आईबी में ऊपर झुके? क्या दूसरे आउटलेट काम करते हैं? किसी अन्य स्पष्ट मुद्दों को न देखें, क्षमा करें।
mc01

जवाबों:


310

मैं self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")फिर से फोन कर रहा हूं । यदि आप एक स्टोरीबोर्ड का उपयोग कर रहे हैं तो आप इसे कॉल नहीं करना चाहते हैं । यह आपके स्टोरीबोर्ड में आपके द्वारा लिखे गए को अधिलेखित कर देगा।

आप अभी भी समस्या की जांच मौसम है, तो reuseIdentifierहै ही में dequeueReusableCellWithReuseIdentifier और में storyboard


18
धन्यवाद! इस पर एक घंटे से अधिक खर्च किया गया क्योंकि एक कस्टम सेल का उपयोग किया गया था।
डॉग कॉफ़ी

मैं एक ही समस्या है, लेकिन कोड की इस लाइन का इस्तेमाल कभी नहीं किया है, आप किसी भी विचार है कि मैं एक ही अपवाद क्यों मिलता है?
डेकेल मैमन

धन्यवाद। इसने मेरे लिए इसे हल कर दिया। मेरे पास एक स्टोरीबोर्ड था और मैंने मैन्युअल रूप से एक व्यू कंट्रोलर जोड़ा। बॉयलरप्लेट कोड में आपके द्वारा उल्लिखित लाइन शामिल थी। भले ही यह सही (सही पहचानकर्ता और वर्ग) लग रहा था, इसने आउटलेट को जोड़ने से इनकार कर दिया। अब यह काम कर रहा है। मिठाई!
जोरिस वीमर

13
यदि आप एक स्टोरीबोर्ड का उपयोग कर रहे हैं तो आप इसे कॉल नहीं करना चाहते हैं। यह आपके स्टोरीबोर्ड में आपके द्वारा लिखे गए को अधिलेखित कर देगा। <- यह एक वास्तव में मेरी मदद करता है
एस.सुक।

6
GAH, UICollectionViewController टेम्पलेट में क्या भयानक बात है !!!!! धन्यवाद, जानोस।
केनी वायलैंड

53

बस इस लाइन को हटा दें:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")

3
मुझे समझ में नहीं आता कि यह मतदान क्यों हुआ। यह मेरी समस्या का जवाब था।
फेलिक्स सिमोस

1
यह सही उत्तर है, और प्रश्न पूछने वाले के अनुसार चिह्नित किया जाना चाहिए। यह समझने के लिए भी बहुत अच्छा होगा कि यह क्यों काम करता है :)
किको लोबो

3
लगता है कि यह घटा दिया गया था क्योंकि इस प्रश्न का उत्तर अगस्त 14 में ही दिया गया था ... जबकि यह उत्तर कई महीनों के बाद यहाँ फिर से उत्तर को कॉपी करता है।
नितिन नैन

1
लेकिन जब मैं इसका उपयोग नहीं करता हूं, तो यह मुझे त्रुटि में विफलता देता है - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:
Shaheera

इस लाइन की आवश्यकता क्यों नहीं है के लिए एक स्पष्टीकरण का स्वागत किया जाएगा। यह वर्तमान में एक नए संग्रह दृश्य के लिए Xcode बॉयलरप्लेट द्वारा जोड़ा गया है।
3

47

यदि आप xib का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपने इस कोड को अपने viewdidload में जोड़ा है।

उद्देश्य सी:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

स्विफ्ट:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")

क्या आपको कक्षा और निब दोनों को पंजीकृत करना है, या केवल निब पर्याप्त है?
रेनकास्ट

3
मैंने सिर्फ निब रजिस्टर किया और इसने मेरी समस्याओं को हल किया।
अमेलिया

ऐसा लगता है कि पंजीकरण करने के दो तरीके हैं और मैं गलत एक का उपयोग कर रहा था ... collectionView? .Register (UINib (nibName: "YourItemClassName", बंडल: nil), forCellWithReetIdentifier: "yourIdentifier") collectionView (YourItemClassName) forCellWithReuseIdentifier: "yourIdentifier")
सर्जियो

17

होगा कि निब लोग रजिस्टर!

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCellId")

6

ऐसा लगता है कि पंजीकरण करने के दो तरीके हैं और मैं पहले गलत का उपयोग कर रहा था। मेरे पास एक कस्टम xib दृश्य है, इसलिए दूसरे विकल्प के साथ पंजीकृत है, और हमारे पास डेटा है!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

0

मुझे एक समान समस्या थी, लेकिन मेरी गलती यह थी कि मैंने कलेक्शन व्यू को लेबल टेक्स्ट को बदलने में सक्षम होने के लिए प्रतिनिधि नहीं रखा था।


0

मुझे लगता है कि सबसे अच्छा समाधान सीधे स्टोरीबोर्ड से उपयोग करना है जहां एक जोड़ें CollectionView, वैकल्पिक रूप से आपको स्टोरीबोर्ड में CollectionViewCellअपने से हटाने CollectionViewऔर निम्नलिखित कमांड के साथ एक सेल रजिस्टर करने की आवश्यकता है :

संग्रह दृश्य .register (UINib (nibName: "YourItemClassName", बंडल: nil), forCellWithReuseIdentifier: "yourIdentifier")

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.