2013-02-01 10 views
9

जब layoutSubviews पर UITableViewCellscellForRowAtIndexPath विधि में कस्टम UITableViewCell पर कॉल किया जाता है? नीचे, FiltersTableViewCellItem संपत्ति सेट करने के बाद मुझे layoutSubviews कॉल करने की आवश्यकता है। क्या यह सही ढंग से स्थापित है? मैं layoutSubviews का उपयोग करने में सक्षम होना चाहता हूं क्योंकि मैंने सुना है कि यह प्रदर्शन के लिए बेहतर है।जब कस्टम UITableViewCell के लिए लेआउटस्यूब्यूव्स को सटीक रूप से कॉल किया जाता है?

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"FiltersTableViewCell"; 
    FiltersTableViewCell *filtersTableViewCell = [[self dequeueReusableCellWithIdentifier:cellIdentifier] retain]; 
    FiltersTableViewCellItem *filtersTableViewCellItem = [[self.filtersTableViewCellItems objectAtIndex:[indexPath row]] retain]; 

    if (!filtersTableViewCell) 
    { 
     filtersTableViewCell = [[FiltersTableViewCell alloc] initWithFiltersTableViewCellItem:filtersTableViewCellItem]; 
     filtersTableViewCell.delegate = self; 
    } 
    else 
    { 
     filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem; 
    } 
    return [filtersTableViewCell autorelease]; 
} 
+0

@ डैनी लिन एआरसी के प्रदर्शन में सुधार के साथ कुछ लेना देना नहीं है। वास्तव में यह autorelease के रूप में बहुत अधिक प्रभाव पड़ता है। –

उत्तर

13

layoutSubviewstableView:willDisplayCell: के बाद किसी बिंदु पर बुलाया जाता है, जिसे tableView:cellForRowAtIndexPath: के बाद बुलाया जाता है। आप प्रासंगिक तरीकों में ब्रेकपॉइंट्स सेट करके और उस क्रम को देखकर इसे सत्यापित कर सकते हैं जिसमें वे हिट हो जाते हैं। उदाहरण के लिए, tableView:cellForRowAtIndexPath: के अंत में ब्रेकपॉइंट सेट करें। तब FiltersTableViewCell

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
} 

के लिए निम्न विधि जोड़ सकते हैं और वहाँ एक ब्रेकपाइंट निर्धारित किया है। फिर ऐप चलाएं और देखें कि क्या होता है।

+4

लेकिन ध्यान दें, भले ही 'layoutSubviews' को 'willDisplayCell' के बाद बुलाया जाता है, इसका मतलब यह नहीं है कि जब स्वयं आकार बदलने के लिए लेआउट पास किया जाता है। मुझे लगता है कि एक स्व-आकार देने वाला सेल जो 'WillDisplayCell' तक पॉप्युलेट नहीं किया जाता है, सही ऊंचाई नहीं मिलता है, भले ही यह' लेआउट IfNeeded 'को कॉल करके लेआउट पास को भी मजबूर करता हो। मुझे काम करने के लिए आत्म-आकार के लिए 'cellForRowAtIndexPath' में पॉप्युलेट करने के लिए अपना कोड बदलना पड़ा। –

-1

इस answer में उल्लेख किया है, वहाँ कई मामलों में जहां यह कॉल कर लिया जाएगा। मैं यह भी कहूंगा कि इसे फिर से कहा जा सकता है जब एक पुन: प्रयोज्य वस्तु पुन: प्रयोज्य कोशिकाओं कतार से निकलती है। पुन: प्रयोज्य वस्तुओं की तलाश करने से पहले FiltersTableViewCellItem को सेट करने का प्रयास करें।

1

अपना आइटम सेट करने के बाद setNeedsLayout को कॉल करने का प्रयास करें।

filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem; 
[filtersTableViewCell setNeedsLayout]; 
संबंधित मुद्दे

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