2009-06-06 42 views
28

प्रदर्शन के लिए UITableView 'कोशिकाओं का पुन: उपयोग करना सामान्य है। क्या टेबलव्यू हेडर 'दृश्यों के साथ एक ही काम करने का कोई तरीका है? मैं जो कि प्रतिनिधि की विधि के साथ वापस आ रहे हैं के बारे में बात कर रहा हूँ:पुन: प्रयोज्य तालिका दृश्य शीर्षलेख दृश्य

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

मैं अपेक्षा के अनुरूप जिसके बाद काम नहीं लगती करने की कोशिश की:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    static NSString *CellIdentifier = @"Header"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 
    if (cell == nil) { 
     cell = [self getHeaderContentView: CellIdentifier]; 
    } 
    return cell; 
} 

वहाँ करने के लिए एक रास्ता है हेडर 'विचारों का पुन: उपयोग करें?

+1

आईओएस 6 के रूप में आप अब 'UITableViewHeaderFooterView' जो reuseIdentifier का उपयोग करता है। – h4xnoodle

+0

लेकिन वर्तमान में आप यूआई बिल्डर के साथ UITableViewHeaderFooterView का उपयोग नहीं कर सकते हैं। –

उत्तर

32

टेबलव्यू कोशिकाओं का पुन: उपयोग करने की क्षमता में निर्मित ऐप्पल का कारण यह है कि तालिकादृश्य में कई पंक्तियां हो सकती हैं, स्क्रीन पर केवल एक मुट्ठी भर प्रदर्शित होती है। प्रत्येक सेल के लिए स्मृति आवंटित करने के बजाय, एप्लिकेशन पहले से मौजूद मौजूदा कोशिकाओं का पुन: उपयोग कर सकते हैं और उन्हें आवश्यकतानुसार पुन: कॉन्फ़िगर कर सकते हैं।

सबसे पहले, शीर्षलेख दृश्य केवल UIViews हैं, और UITableViewCell UIView का उप-वर्ग है, लेकिन उन्हें किसी सेक्शन हेडर के दृश्य के रूप में नहीं रखा जाना है।

आगे, चूंकि आपके पास आम तौर पर कुल पंक्तियों की तुलना में बहुत कम अनुभाग शीर्षलेख होंगे, इसलिए पुन: प्रयोज्य तंत्र बनाने का कोई कारण नहीं है और वास्तव में ऐप्पल ने सामान्य UIViews के लिए एक लागू नहीं किया है।

ध्यान दें कि यदि आप केवल शीर्षलेख में लेबल सेट कर रहे हैं, तो आप इसके बजाय -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section का उपयोग कर सकते हैं।

जैसे लाल पाठ (या एक बटन, छवि, आदि) के साथ एक लेबल के रूप में कुछ और अधिक कस्टम, आप इस तरह कुछ कर सकते हैं के लिए:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0,0, 320, 44)] autorelease]; 
    UILabel *label = [[[UILabel alloc] initWithFrame:headerView.frame] autorelease]; 
    label.textColor = [UIColor redColor]; 
    label.text = [NSString stringWithFormat:@"Section %i", section]; 

    [headerView addSubview:label]; 
    return headerView; 
} 
+0

मुझे लगता है कि लेबल autorelease नहीं होना चाहिए, लेकिन इसे शीर्षलेख में जोड़ा गया है के बाद रिलीज। आपके दिल में क्या है? – gsempe

+14

"पुन: प्रयोज्य तंत्र बनाने का कोई कारण नहीं है ..."मार्टिन्स टिप्पणी आम तौर पर सही है, लेकिन पूरी तरह से नहीं। किसी भी व्यक्ति जो 60fps तक पहुंचने की कोशिश कर रहा है (मेरे जैसा), कस्टम व्यू के साथ viewForHeaderInSection, शैतान है। प्रत्येक शीर्षलेख के लिए एक नया दृश्य जोड़ना, खासकर यदि आपके समूह बड़े नहीं हैं , वस्तुतः प्रदर्शन प्रदर्शन तक पहुंचना असंभव बना देगा, क्योंकि यह आम तौर पर मुझे 5 एफपीएस खर्च करेगा। यदि आप अपने डिजाइन में कस्टम हेडर से बच सकते हैं, तो यह आपको एक प्रदर्शन बढ़ावा देगा। –

+2

लेकिन अगर आपको वास्तव में कस्टम हेडर दृश्यों का उपयोग करने की आवश्यकता है तो क्या होगा , एफपीएस को 60 तक रखने का सबसे अच्छा तरीका क्या है? –

10

एक सरल अभी तक प्रभावी समाधान:

@interface SectionedTableViewController() 
    @property (nonatomic, strong) UINib*   sectionHeaderNib; 
    @property (nonatomic, strong) NSMutableArray* sectionHeaders; 
@end 

@implementation SectionedTableViewController 

@synthesize sectionHeaderNib = sectionHeaderNib_; 
@synthesize sectionHeaders = sectionHeaders_; 

- (void) viewDidUnload 
{ 
    self.sectionHeaders = nil; 
    [super viewDidUnload]; 
} 

- (NSMutableArray*) sectionHeaders 
{ 
    if (!sectionHeaders_) 
     self.sectionHeaders = [NSMutableArray array]; 
    return sectionHeaders_; 
} 


- (UINib*) sectionHeaderNib 
{ 
    if (!sectionHeaderNib_) 
     self.sectionHeaderNib = [UINib nibWithNibName: NSStringFromClass(YourHeaderView.class) bundle: nil]; 
    return sectionHeaderNib_; 
} 


- (YourHeaderView*) dequeueHeader 
{ 
    return [self.sectionHeaders firstObjectPassingTest: ^(id obj) { return (BOOL) ([obj superview] == nil); }]; 
} 


- (NSString*) sectionHeaderTitleForSection: (NSInteger) section 
{ 
    return nil; 
} 


- (UIView*) tableView: (UITableView*) tableView viewForHeaderInSection: (NSInteger) section 
{ 
    YourHeaderView* headerView = [self dequeueHeader]; 
    if (!headerView) 
    { 
     headerView = [YourHeaderView instanceFromNib: self.sectionHeaderNib]; 
     [self.sectionHeaders addObject: headerView]; 
    } 
    return headerView; 
} 

@end 
+0

यह क्या है: firstObjectPassingTest? –

7

आपको लगता है कि लागू कर सकते हैं UITableViewHeaderFooterView वर्ग बनाने यह के उपवर्ग UIView है द्वारा तुम भी एक इंडी बनाने की जरूरत vidual XIB क्योंकि यह UITableViewHeaderFooterView निर्माण के साथ स्वचालित रूप से नहीं बनाया जाएगा।

रजिस्टर tableview के साथ नोक

[self.tblCart registerNib:[UINib nibWithNibName:@"CartHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"CartHeader"]; 

अब आप उपयोग कर सकते हैं कि में viewForHeaderInSection

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 

    CartHeaderView *sectionHeader=[tableView dequeueReusableHeaderFooterViewWithIdentifier:@"CartHeader"]; 
return sectionHeader; 
} 

नोट: पृष्ठभूमि रंग सेट करने के लिए आप अनुभाग के रूप में ही फ्रेम के साथ एक subview बनाने की आवश्यकता होगी हेडर और उस दृश्य के लिए रंग सेट करें।

आप का अनुसरण कर सकते

Changing the background color on a UITableViewHeaderFooterView loaded from a xib says to use contentView.backgroundColor instead

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