2012-10-31 13 views
15

मेरे पास UIViewController के भीतर एक UICollectionView है। संग्रह में CellForItemAtIndexPath देखें: विधि, यह डेटा स्रोत के आधार पर कस्टम कक्षों की एक श्रृंखला बनाता है। बदले में कस्टम कोशिकाओं में एक यूवीव्यू होता है, जो एकल पीडीएफ पृष्ठों को आकर्षित करने के लिए उप-वर्गीकृत होता है।UICollectionView स्क्रॉलिंग के बाद गलत सेल दिखा रहा है - डेक्यू समस्या?

यह एक पीडीएफ फ़ाइल को अपने एकल पृष्ठों में विभाजित करने के लिए इस तरह से स्थापित किया गया है, इसलिए सेल 1 में पीडीएफ पेज 1 है, सेल 2 में पीडीएफ पेज 2 और इसी तरह है। अब तक बहुत अच्छा है, मेरी समस्या यहां है:

जब मैं स्क्रॉल करता हूं, तो UICollectionView गलत कोशिकाओं को प्रदर्शित करना शुरू करता है। उदाहरण के लिए, 34 पेज दस्तावेज़ में, यह सही क्रम में सेल्स/पेज 1-16 दिखाता है, लेकिन फिर पेजों को प्रदर्शित करना शुरू करता है जो लग रहा था, जैसे सेल 1, सेल 2, सेल 4। सेल/पेज 34 के पास कहीं भी जाएं।

मैंने अतीत में UITableView से समान व्यवहार देखा है, और मानते हैं कि इसमें कोशिकाओं को हटाने, या एक प्रतिनिधि विधि के साथ कुछ करना है। बिल्कुल यकीन नहीं है - किसी भी मदद की सराहना की है।

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

//create custom cell 
CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath]; 

//set file name (always the same; one PDF file) 
cell.fileName = fileName; 
cell.backgroundColor = [UIColor clearColor]; 

//set the title to the page number 
cell.title = [NSString stringWithFormat:@"page %@", [countArray objectAtIndex:indexPath.row]]; 

//set the current page (which indicates which page to display) according to the pageCount 
cell.currentPage = [[countArray objectAtIndex:indexPath.row] intValue]; 

return cell; } 
+0

शायद मुझे एक ही समस्या है। क्या आपको एक समाधान मिला? – chris

उत्तर

14

मुझे समेकित समस्याएं हैं। यह सबसे अधिक संभावना है क्योंकि पुन: उपयोग की गई कोशिकाएं खुद को फिर से नहीं लेती हैं। अपने कस्टम सेल की सामग्री वर्ग (अपने पीडीएफ देखें) में, redrawing अगर फ्रेम अद्यतन किया जाता है को गति प्रदान:

-(void)setFrame:(CGRect)frame { 
    [super setFrame:frame]; 
    [self setNeedsDisplay]; // force drawRect: 
} 

यह मेरे लिए काम किया। इसके अलावा, यदि आपके सेल के आकार को बदल सकता है, autoresizing मुखौटा सेट इतना है कि यह प्रारंभ दौरान

self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

के साथ अंतरिक्ष भरता है।

+1

यह मेरे लिए काम किया - आपकी मदद के लिए धन्यवाद। UICollectionView के CellForItemAtIndexPath के अंदर से ऊपर सेट फ्रेम विधि को कॉल करना, पीडीएफ को फिर से निकालने के लिए मजबूर किया गया। बहुत धन्यवाद। –

+0

बढ़िया! कॉलिंग 'सेटफ्रेम:' शायद संभवतः आवश्यक नहीं है क्योंकि संग्रह दृश्य वैसे भी करता है। – chris

+0

आकार बदलने वाले मुखौटा को स्थापित करने में मदद मिली, – peko

12

फिक्स्ड समान मुद्दा prepareForReuse विधि

का उपयोग कर बस अपने कस्टम सेल कार्यान्वयन के लिए इस विधि को जोड़ने

- (void)prepareForReuse { 

    self.fileName = nil; 
    self.title = nil; 

    // add remaining properties 

} 
+0

जब मैं इसे कॉल करता हूं? –

+2

@PuneethKamath आपको इस विधि को कॉल करने की आवश्यकता नहीं है, बस इसे आप में जोड़ें UICollectionViewCell subclass –

+3

मेरे लिए काम नहीं करता – AndrewK

1

मैं Asatur Galstyan के उत्तर के आधार पर तेज में एक ऐसी ही समस्या का समाधान हो।

एक स्टोरीबोर्ड में एक सेल के लिए एक कस्टम वर्ग जोड़ के बाद prepareForReuse() फ़ंक्शन ओवरराइड किया जा सकता:

import UIKit 

class SomeCollectionViewCell: UICollectionViewCell { 

    @IBOutlet weak var exampleView: UIView! 
    @IBOutlet weak var exampleLabel: UILabel! 

    override func prepareForReuse(){ 
     super.prepareForReuse() 
     exampleLabel.textColor = nil 
     exampleView.backgroundColor = nil 
     exampleView.layer.cornerRadius = 0 
    } 
} 

वहाँ prepareForReuse के डिफ़ॉल्ट कार्यान्वयन() के अलावा कुछ नहीं Apple recommends calling the the super.prepareForReuse() when overriding anyway (कम से कम आईओएस 10 में) करता है।

+1

आपके उदाहरण से कार्य करते हुए, मैंने पाया है कि 'exampleView.setNeedsDisplay() '' readyForReuse() ' समस्या का हल किया। – JKaz