UICollectionView का सेल फ़ोर इटइमएटइंडेक्सपैथ नहीं कहा जा रहा है


104

केवल UICollectionView का उपयोग करते हुए मेरा दूसरा समय है और शायद मैंने इससे अधिक काट लिया है जो मैं चबा सकता हूं लेकिन फिर भी:

मैं एक UICollectionView (myCollectionView) को लागू कर रहा हूं, जो कस्टम UICollectionViewCell का उपयोग करता है, जिसे मैंने उप-वर्गित किया है। उप-वर्गित कोशिकाएं (FullReceiptCell) में UITableView है और यह व्यूकंट्रोलर के आकार के हैं। मैं FullReceiptCells के बीच क्षैतिज स्क्रॉलिंग के लिए अनुमति देने का प्रयास कर रहा हूं।

उप-संग्रह किए गए UICollectionViewController जिसमें myCollectionView शामिल है, को एक नौसेना नियंत्रक स्टैक पर धकेल दिया जा रहा है। वर्तमान में, myCollectionView loas और क्षैतिज स्क्रॉलिंग सक्षम है। हालांकि, कोई कोशिकाएं दिखाई नहीं देती हैं। मैंने इसकी पुष्टि की है

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

चला गया है और 0. से अधिक पूर्णांक लौटा रहा है। मैंने यह भी पुष्टि की है कि myCollectionView के प्रतिनिधि और डेटा स्रोत ठीक से उपवर्गित UICollectionViewController के लिए IB में सेट हैं।

वह विधि जहाँ कोशिकाओं को लोड किया जाना है:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

नहीं बुलाया जा रहा है।

यहाँ है जहाँ मैं उस नियंत्रक के भीतर UICollectionViewController और मेरे दृश्यडायोड विधि को धक्का देता हूं (नोट: initWithBill सामान्य इनिशियलाइज़र का एक ओवरराइड है):

पूर्व ViewControllers .m फ़ाइल में:

FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];

FullReceiptViewController.m में:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
    self.myCollectionView.pagingEnabled = YES;
    // Setup flowlayout

    self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
    [self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    [self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
    self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
    [self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
    //testing to see if the collection view is loading
    self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];

कोई सुराग क्यों नहीं कहा जा रहा है?


मैं XIB का उपयोग कर रहा हूं। मैं CellForItemsAtIndexPath में कुछ भी धोखा नहीं दे सकता क्योंकि यह कभी नहीं कहा जाता है।
इकेगावाटारो

जवाबों:


135

बाद में यहाँ ठोकर खाने वालों के लिए .... कारण:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

इसलिए नहीं बुलाया जा रहा था क्योंकि संग्रह के लिए आइटम देखें।

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];

अगर मैं ऊंचाई को 410 में बदल देता हूं, तो यह CellForItemAtIndexPath को निष्पादित करेगा।


क्या आप थोड़ा और विस्तृत कर सकते हैं। वही मेरे लिए हो रहा है
user1010819

मैं बस पता चला कि आप collectionViewContentSize साथ सावधान रहने की भी जरूरत है
दिमितार Marinov

49
यदि आप ऑटोलैयूट का उपयोग कर रहे हैं - तो संग्रह दृश्य पर एक ऊँचाई की कसौटी निर्धारित करना सुनिश्चित करें - इस पर कई घंटे बर्बाद!
bpn

रिकॉर्ड ऊंचाई की कमी के कारण मेरे लिए काम नहीं किया .. क्षैतिज केंद्र
कसौटी

4
यदि आपका संग्रह दृश्य AutoLayout के साथ TopLayoutGuide के लिए विवश है, और NavigationBar के तहत स्क्रॉल करने वाला नहीं है, तो Adjust Scroll View Insetsस्टोरीबोर्ड पर अपने ViewController पर अनचेक करें।
ब्रूनो गैलीनेरी

96

मेरे मामले में, ऐसा इसलिए हुआ क्योंकि मेरे लेआउट वर्ग ने UICollectionViewLayoutइसके बजाय गलत तरीके से उपवर्ग बनाएUICollectionViewFlowLayout


1
धन्यवाद। बुगर मुझे उस पर उम्र बिताई।
रामबेटिनो

यह मेरा मुद्दा भी था! यह थोड़ा उल्टा है, इसलिए यह मेरे साथ भी नहीं हुआ। इसके लिए धन्यवाद!
वेंडीकिड

मेरे लिए भी वैसा ही! इसकी अनदेखी करना इतना आसान है! धन्यवाद फिर से
arvidurs

फेसपालम ने यहां, इस बात को इंगित करने के लिए धन्यवाद दिया (4 साल पहले)।
मिलेंडर

मैं उसी मुद्दे का सामना कर रहा था। धन्यवाद
पीयूष गुप्ता

31

यदि आप संग्रह दृश्य को सामग्री आकार की जानकारी प्रदान नहीं करते हैं तो CellForItemAtIndexPath को कॉल नहीं किया जाएगा।

  1. यदि आप फ़्लो लेआउट का उपयोग कर रहे हैं : तो आपको आइटम आकार ठीक से सेट करने की आवश्यकता है।
  2. यदि आपके पास UICollectionViewLayout से उप-कस्टम लेआउट है : सुनिश्चित करें कि आप collectionViewContentSize विधि से उचित आकार वापस कर रहे हैं।

उत्तरार्द्ध के मामले में, आप यह भी देखेंगे कि आपका लेआउटएट्यूएंटेसफोरऑर्सेसरेक्ट भी नहीं कहा जाता है। कारण यह है कि आपने निर्दिष्ट नहीं किया है कि आपकी सामग्री का आकार क्या है और डिफ़ॉल्ट रूप से आकार CGSizeZero होगा। यह मूल रूप से संग्रह दृश्य बताता है कि आपके पास पेंट करने के लिए कोई सामग्री नहीं है, इसलिए यह आपको विशेषताओं या कोशिकाओं के लिए पूछने से परेशान नहीं करता है।

तो, बस संग्रह देखें ओवरकोड करें और वहां एक उचित आकार प्रदान करें, इससे आपकी समस्या का समाधान होना चाहिए।


1
उदाहरण के लिए पूर्ण उपलब्ध आकार का उपयोग करने के लिए, collectionView.find.size को
एडम लविंग

धन्यवाद! इस उत्तर से मुझे b / c में मदद मिली, मेरे पास एक कस्टम UICollectionViewLayout है। यदि मैंने लैंडस्केप ओरिएंटेशन में सिम्युलेटर में ऐप शुरू किया, तो कुछ सेल प्रारंभिक दृश्य में दिखाई नहीं दे रहे थे। सामग्री के आकार को ओवरराइड करने से मेरे लिए यह समस्या ठीक हो गई।
क्रिस लिवडल

1
धन्यवाद। मेरे मामले में collectionViewContentSizeगलत तरीके से चौड़ाई के लिए 0 लौटा, इसलिए cellForItemAtIndexPathबुलाया नहीं जा रहा था।
इस्करिक

16

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

<UICollectionViewDelegate, UICollectionViewDataSource>

और अपने विचार में इस जोड़ें विधि:

self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;

इसके अलावा, यदि आप इसे एक .xib के माध्यम से लोड कर रहे हैं, तो सुनिश्चित करें कि आपने IBOutlet को UICollectionView से कनेक्ट किया है।


1
मैंने इसे नहीं दिखाया, लेकिन मेरे पास पहले से ही हेडलेट और डेटा स्रोत हेडर फ़ाइल में है। इसके अतिरिक्त, मैंने IButlet को myCollectionView पर वायर्ड कर दिया है। इस संग्रह के लिए प्रतिनिधि और डेटा स्रोत FullReceiptViewController के लिए निर्धारित किया गया है। अजीब बात यह है कि numberOfItemsInSection (एक डेटा स्रोत प्रोटोकॉल) कहा जा रहा है और एक पूर्णांक को 0. से अधिक लौटा रहा है
IkegawaTaro

हम्म, जब आप एप्लिकेशन लॉन्च करते हैं तो संग्रह दृश्य दिखाता है या कुछ भी करता है? ऐसा लगता है जैसे इसमें कुछ आइटम हैं अगर नंबरऑफइमेट्सइन्फेक्शन 0 से कुछ अधिक रिटर्न देता है
एंथोनी कैस्टेलि

फॉलो करने के लिए धन्यवाद। संग्रह दृश्य दिखाता है ... मैं बता सकता हूं क्योंकि मैंने पृष्ठभूमि का रंग बदल दिया है। मेरा मानना ​​है कि मुझे समस्या मिली है: [self.myCollectionViewFlowLayout setItemSize: CGSizeMake (320, 548)]; यह बहुत बड़ा था। यदि मैं ऊंचाई को 410 तक कम कर देता हूं, तो मुझे कहा जा सकता है सेलफोर इटेमएटइंडेक्सपैथ विधि कहा जा सकता है।
इकेगावाटारो

@AnthonyCastelli नमस्कार, मैं भी इसी मुद्दे का सामना कर रहा हूं, नंबरऑफइमेट्सइन्सेक्शन जो पॉप पर देखने के लिए कहे जा रहे हैंकंट्रोलर लेकिन सेलफॉरइमेट्सएटीआईएंडएक्सपैथ नहीं। तो क्या आपको सुराग मिला है?
भाविन कंसागरा

16

अधिक जटिल दृश्य के लिए कृपया इस ब्लॉग को देखें । इसने मेरी जान बचाई!

self.automaticallyAdjustsScrollViewInsets = NO;

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

15

यदि आपकी कक्षा UICollectionviewController से उपवर्ग है और आप प्रोग्राम व्यू कलेक्शनल रूप से बना रहे हैं तो उपयोग करें

let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .Vertical
    layout.itemSize = CGSizeMake(50, 50)

    collectionView?.setCollectionViewLayout(layout, animated: false)

यह जवाब मेरी समस्या हल हो गई है! ओवरराइड विधि func collectionView (_ संग्रह दृश्य: UICollectionView, लेआउट संग्रहदृश्य दृश्य: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSP {<# कोड #>} मेरे लिए काम नहीं करता है।
माइक

8

मैं ऑटोलेयूट का उपयोग कर रहा था, और मेरे मामले में ऊंचाई की कमी गायब थी


6

मेरा मुद्दा यह था कि मेरे पास एक ही दृश्य में 2 संग्रह दृश्य थे, और दोनों एक संकलित UICollectionViewFlowLayoutउदाहरण साझा कर रहे थे । एक बार जब मैंने एक ही प्रवाह लेआउट के अलग-अलग उदाहरण बनाए, तो यह ठीक काम किया।


5

मेरे मामले में, जो मैं बहुत बेवकूफी से करना भूल गया था वह UICollectionViewDataSourceप्रोटोकॉल पद्धति को लागू करना था numberOfItemsInSection, इसलिए यह जांचने के लिए एक और चीज है।


4

यह भी सुनिश्चित करें कि संग्रह दृश्य को एनीमेशन (इन्सर्ट, डिलीट, अपडेट या परफॉरमेंस या अपडेट) के साथ अपडेट करते समय पुनः लोड नहीं किया जाता है।


4

मेरे मामले में, collectionView.prefetchingEnabled = NO;मेरी समस्या का समाधान किया। केवल iOS 10 पर काम करता है।


2
मैंने कुछ समय पहले उस उत्तर को उकेरा और आज इसने फिर से मेरी मदद की: डी यू यू इस नॉलेज मैन के लिए एक योग्य व्यक्ति। एक बार फिर धन्यवाद!
मैकीक Czarnik

इस जवाब ने मेरे लिए काम किया! काश, इसके साथ शामिल होने के लिए एक स्पष्टीकरण था क्योंकि मैंने इसे कभी भी शुरू करने के लिए सच नहीं किया था।
लांस सामरिया

3

यह मेरे लिए तब हो रहा था जब आइटम की ऊंचाई == 0 को ठीक करके उस सेलफोरइम विधि को बुलाया गया था।


3

दस मिनट पहले मुझे भी इस समस्या का सामना करना पड़ा, मैंने एक मूर्खतापूर्ण गलती की।

मेरा इरादा UICollectionViewFlowLayout का उपयोग करना है,

लेकिन गलतियों के कारण, मैंने UICollectionViewLayout का उपयोग किया।


3

मेरे मामले में, UINavigationBar को NO में बदलने से समस्या हल हो गई।


3

Xcode 7.0.1 में, हमें यह समस्या तब आई जब हमने एक स्टोरीबोर्ड और साथ में किसी अन्य प्रोजेक्ट से कोड कॉपी किया। संग्रह दृश्य में स्टोरीबोर्ड में एक कस्टम फ्लो लेआउट सेट था। समाधान यह था:

  • आईबी में प्रवाह लेआउट निकालें
  • एप्लिकेशन को संकलित / चलाएं
  • प्रवाह लेआउट वापस सेट करें

अब यह काम किया :)


2

सुनिश्चित करें कि numberOfSectionsInCollectionViewएक सकारात्मक पूर्णांक भी देता है।

संग्रह में कम से कम एक अनुभाग होना चाहिए।


2

सुनिश्चित करें - (NSInteger) संग्रह दृश्य: numberOfItemsInSection: एक सकारात्मक (पढ़ें, शून्य से अधिक) मान लौटा रहा है। यह [self.collectionView reloadData] रखने की बात हो सकती है; पूर्ण हैंडलर में।


2

मैं संग्रह दृश्य पर गलत करने के लिए ऑटोरेस्‍यिंग मास्क लगाना भूल गया:

collectionView.translatesAutoresizingMaskIntoConstraints = false

2

यह लेआउट संबंधी समस्याओं को महसूस किया जा सकता है। यदि मौजूद है, तो कंसोल से लेआउट चेतावनियों की जाँच करें।


2

मेरे मामले में संग्रह दृश्य पूरी तरह से गलत ऑटो लेआउट की कमी के कारण इसके मूल दृश्य में दिखाई नहीं दे रहा था। अतः बाधाओं को ठीक करते हुए संग्रह दृश्य को सभी दृश्यमान बना दिया गया और CellForItemAtIndexPath को बुलाया गया।


2

स्टोरीबोर्ड / xib UICollectionView प्रॉपर्टी सेल में शामिल होना जरूरी नहीं है {0, 0}


2

यदि आप संग्रह दृश्य प्रोटोकॉल का उपयोग कर रहे हैं, तो आपको अपने ViewController को प्रोटोकॉल CollectionViewDataSourceऔर कनेक्ट करना होगा CollectionViewDelegateइंटरफ़ेस बिल्डर आउटलेट्स


1

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


मैंने स्टोरीबोर्ड में एक और UIViewController से अपने UICollectionView की नकल की। मैंने CollectionView को हटा दिया और इसे फिर से बनाने के लिए जोड़ा। आपके उत्तर के लिए धन्यवाद।
शराबी पिताजी

1

बस कुछ विशिष्ट स्थिति के लिए, इस समस्या को हल किया।

मेरे मामले में, मैं मैन्युअल रूप से UICollectionViewController को एक पैरेंट व्यू कॉन्ट्रोलर में प्रारंभ कर रहा था, और फिर एक सबव्यू के रूप में UICollectionViewController के दृश्य जोड़ रहा था।

मैंने माता-पिता के दृश्य में संग्रह दृश्य पर 'setNeedsLayout' और / या 'setNeedsDisplay' को कॉल करके समस्या हल की:

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   [_collection.view setNeedsLayout];
   [_collection.view setNeedsDisplay];
}

1

उपयोग करते UICollectionViewDelegateFlowLayoutसमय सावधान रहें कि यह फ़ंक्शन क्या देता है। दोनों widthऔर heightसे अधिक होना चाहिए 0। मैंने windowफ्रेम संदर्भ के रूप में उपयोग किया, लेकिन जटिल दृश्य के कारण पदानुक्रम विंडो nilरनटाइम पर थी । यदि आपको स्क्रीन की चौड़ाई के उपयोग के आधार पर तत्व की चौड़ाई को समायोजित करने की आवश्यकता है UIScreen.main.bounds

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
           UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}

1

मेरे मामले में मेरे पास collectionViewएक UIStackViewसाथ था alignment = .center। इसलिए collectionViewचौड़ाई नहीं थी। जब सब कुछ करने के stackView.alignmentलिए सेट .fillठीक था।


0

मेरे लिए, मैं autolayout के माध्यम से self.view (collectionView का पर्यवेक्षक) की ऊंचाई को अपडेट करता हूं, और layoutIfNeededउसके बाद MUST कॉल करना चाहिए ।

[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];

0

मेरे मामले में मुझे अनुमानित सामग्री आकार समायोजित करना पड़ा। सामग्री का आकार ऐसा नहीं किया।

  let layout = collectionVC.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: 100, height: 100)
    layout.estimatedItemSize = CGSize(width: 100, height: 100)

0

मुझे भी ऐसी ही समस्या हो रही थी। लेकिन इसके बजाय cellForItemAtIndexPathतब बुलाया गया था जब वस्तुओं की संख्या> 1 थी, लेकिन तब नहीं जब केवल एक आइटम था। मैंने यहां कई प्रस्तावित समाधानों की कोशिश की और कई के समान मैंने पाया कि इसे आइटम साइज़िंग के साथ करना था। मेरे लिए समाधान के अनुमान आकार बदलने के लिए था UICollectionViewसे स्वचालित करने के लिए कस्टम

कस्टम के लिए अनुमान आकार सेट करें


-1

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

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