2013-01-22 10 views
7

मैं एक कस्टम सेल उपवर्गीकरण UICollectionViewCell के साथ एक UICollectionView है। मेरी cellForItemdequeueReusableCellWithIdentifier पुन: उपयोग नहीं कोशिकाओं

AHPinterestCell *cell = 
       (AHPinterestCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"AHPinterestCell" 
                      forIndexPath:indexPath]; 

में

[self.collectionView_ registerClass:[AHPinterestCell class] 
     forCellWithReuseIdentifier:@"AHPinterestCell"]; 

यह है कि क्या चला जाता है, हालांकि, यह है कि यह सेल पुन: उपयोग नहीं कर रहा है लगता है: और कोड में मैं निम्नलिखित किया है। स्क्रीन प्रति मेरे संग्रह ध्यान में रखते हुए यह 9-10 के बारे में कोशिकाओं को दिखा रहा है, लेकिन जब मैं अनंत स्क्रॉल और फिर मैं फोन insertItemsAtIndexPath यह, अपने कस्टम सेल पर initWithFrame प्रणाली को बुलाती है, जबकि यह शायद कोशिकाओं मैं पहले से ही है पुनः उपयोग करना चाहिए। ऐसा क्यों है?

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

मैं एक नमूना डेमो परियोजना है कि समस्या को दिखाता है द्वारा जोड़ा जा रहा, xcode परियोजना के लिए लिंक पाया जा सकता है here। जब आप नीचे तक पहुंचते हैं तो यह अनिवार्य रूप से एक अनंत स्क्रॉल कर रहा है, यह सिर्फ इसमें अधिक सामान जोड़ता है। लेकिन जब आप ऐसा करते हैं तो यह फिर से init विधि को कॉल करने जा रहा है।

+0

@Rob मैं रजिस्टर कॉल कर रहा हूं क्लाउड दृश्य में देखेंडलोड – adit

+0

@ सांग इसे सिर्फ 10 की तरह ही करना चाहिए और बाकी जब मैं स्क्रॉल करता हूं तो उसे कभी भी इनिट को कॉल नहीं करना चाहिए क्योंकि यह पहले से ही मेरे पास है – adit

+0

@Sang यह सुनिश्चित करें कि आप कितने हैं जब यह दिखाई देता है तो init जाएगा? तो मेरे मामले में मेरे पास एक UICOllectionView है जिसमें इसमें 100 सेल्स हैं, फिर भी एक बार स्क्रीन पर 10 दिखाए जाते हैं। तो मुझे लगता है कि केवल 10 init को बुलाया जाएगा और बाकी का पुन: उपयोग किया जाएगा – adit

उत्तर

4

संक्षेप में, अपने कोड ठीक काम करता है। जैसा कि अपेक्षित है, क्योंकि कोशिकाएं स्क्रीन से स्क्रॉल करती हैं, फिर भी उन्हें पुन: उपयोग के लिए उपलब्ध होने के रूप में चिह्नित किया जाता है। और जब आप dequeueReusableCellWithReuseIdentifier कहते हैं, अगर वहाँ पुनः उपयोग के लिए एक सेल उपलब्ध, वह ऐसा ही करेगा। यदि नहीं, तो यह एक बनाता है।

समय है कि आप कोशिकाओं का एक बहुत बनाया जा रहा दिखाई देगा, जब तेज या लगातार स्क्रॉल है। लेकिन यदि आप छोटी छोटी स्क्रॉल करते हैं, तो चलो, रोकें, यूआई को पकड़ें और दोहराएं, फिर आप बहुत कम कोशिकाओं को बनाएंगे।

मैं जिसका अर्थ है कि आईओएस यूआई और पुराने कोशिकाओं के dequeuing से अधिक नई कोशिकाओं, उनके पुन: उपयोग के लिए अनुमति देता है के निर्माण प्राथमिकता के रूप में इस व्याख्या। तो यदि आप जल्दी से फ्लिप करते हैं, तो इसे पुन: उपयोग करने के लिए पुरानी कोशिकाओं को पकड़ने और फ़्लैग करने में परेशानी होती है। यह शायद पूरी तरह से बुरा नहीं है, क्योंकि शायद यह संग्रह दृश्यों को इस तरह के चिकनी प्रवाह देता है। पुन: उपयोग के लिए पुरानी कोशिकाओं को फ़्लैग करना आईओएस के लिए यहां कम महत्वपूर्ण चीजों में से एक है। लेकिन स्पष्ट रूप से अगर स्मृति तंग है, तो यह एक समस्या हो सकती है।

वैसे, यदि आप dealloc में NSLog डालते हैं, तो भी आप देखेंगे कि जब यूआई अंत में संग्रह दृश्य के माध्यम से वास्तव में तेज़ी से स्क्रॉल करने के बाद पकड़ लेता है, तो इसमें स्पष्ट रूप से कुछ तर्क है जो कहते हैं "जी, मुझे वास्तव में जरूरत से ज्यादा स्पेयर सेल मिल गए हैं, मैं इनमें से कुछ से छुटकारा पाने जा रहा हूं। " यह वास्तव में एक बहुत चालाक कार्यान्वयन है। गति पर एक फोकस, लेकिन यूआई quiets नीचे एक बार होने वाली कुछ स्मृति अनुकूलन के साथ।

+0

रोब हो, रोब, महान अवलोकन .. तो मैं इसे कैसे बना सकता हूं ताकि जब मैं नई वस्तुओं को सम्मिलित करता हूं तो यह कोशिकाएं नहीं बनाता है? इससे मुझे स्मृति समस्याएं पैदा हो रही हैं क्योंकि यह बढ़ती जा रही है। – adit

+0

@adit मुझे संदेह है कि यदि आप 'यूआईसीओलेक्शन व्यू' का उपयोग करते हैं, तो आप स्मृति उपयोग पर यूआई के अंतर्निहित प्राथमिकता के साथ फंस गए हैं। यदि आप चाहते थे, तो आप हमेशा 'UICollectionView' को jettison कर सकते हैं और इसके बजाय,' scrollViewDidScroll' में, अनंत स्क्रॉलिंग के साथ अपने स्वयं के 'UIScrollView' उपclass को कार्यान्वित कर सकते हैं, नई कोशिकाओं के निर्माण पर पुरानी कोशिकाओं को जारी करने से प्राथमिकता दी गई है। आपको बस यह पता लगाना होगा कि कितनी 'UICollectionView' कार्यक्षमता आप अपने स्वयं के 'UIScrollView' में स्वयं को पुन: कार्यान्वित करना चाहते हैं। – Rob

0

सहमत हैं, मुझे एक ही समस्या है, लेकिन मैंने उपलब्ध होने पर मुझे दृश्यमान सेल देने के लिए एक श्रेणी बनाने का विचार किया।

// Header file UITableView+VisibleCell.h" 
@interface UITableView (VisibleCell) 
- (UITableViewCell*) visibleCellForRowAtIndexPath:(NSIndexPath *)indexPath; 
@end 


// Implementation file UITableView+VisibleCell.m 
#import "UITableView+VisibleCell.h" 

@implementation UITableView (VisibleCell) 

- (UITableViewCell*) visibleCellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    for(UITableViewCell* currentVisibleCell in self.visibleCells) 
    { 
     NSIndexPath* currentPath = [self indexPathForCell: currentVisibleCell ]; 
     if([currentPath isEqual:(id) indexPath]) 
     { 
      return currentVisibleCell; 
     } 
    }  
    return nil; 
}  
@end 

तुम भी शैली की अपनी एक सवाल हो रही दिखाई सेल तो cellForRowAtIndexPath वापसी शून्य के बजाय, द्वारा शुरू कर सकते हैं। (मैं इस यह becomeFIrstResponder बनाने के लिए जब किसी सेल का एक दिया टैग के साथ एक UITextField को पुनः प्राप्त करने के लिए आवश्यक है, लेकिन cellForRowAtIndexPath मेरे सेल फिर से आवंटन, बहुत निराशा होती है।

+1

ग्रेट, यह यूआईसीओलेक्शन व्यूसेल के लिए भी काम करता है – zaheer

0

अपनी डिवाइस सेटिंग से पहुंच को बंद कर दें रखा। इसकी एक बग। मुझे अपने आईपैड मिनी पर एक ही समस्या है।

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