2012-02-05 8 views
18

मैं एक XIB का उपयोग कर कस्टम UITableViewCell बनाना चाहता हूं, लेकिन मुझे यकीन नहीं है कि UITableViewController के क्यूइंग तंत्र का उपयोग करके इसे रीसायकल कैसे करें। मैं यह कैसे हासिल कर सकता हूं?मैं XIB से बनाए गए UITableViewCell ऑब्जेक्ट्स को रीसायकल कैसे कर सकता हूं?

लोग, इस प्रश्न का उद्देश्य the FAQ के अनुसार स्वयं का उत्तर देने का इरादा था, हालांकि मुझे शानदार प्रतिक्रियाएं पसंद हैं। कुछ अपवित्र हैं, खुद को एक बियर के साथ इलाज करें। मैंने यह पूछा क्योंकि एक दोस्त ने मुझसे पूछा और मैं इसे स्टैक ओवरफ्लो पर रखना चाहता था। यदि आपके पास योगदान करने के लिए कुछ भी है, तो हर तरह से!

उत्तर

51

आप आईओएस 5 उपयोग कर रहे हैं आप

[self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
              bundle:nil] 
    forCellReuseIdentifier:@"cellIdentifier"]; 

तो उपयोग कर सकते हैं जब भी आप कहते हैं:

cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 

tableview या तो निब लोड और आप एक सेल देते हैं, या एक सेल विपंक्ति होगा तुम्हारे लिए!

निब केवल इसके अंदर परिभाषित एक एकल तालिकादृश्य के साथ एक निब होना चाहिए!

+3

इस बारे में नहीं पता था। – Moshe

+2

यह आईओएस 5 के साथ पेश की गई एक नई एपीआई थी - जिस दिन मैंने इसे देखा था, उसका उपयोग कर रहा था - जीवन को इतना आसान बनाता है! आप UITableViewCell को उप-वर्गीकरण करके और आईबीओलेट गुणों को जोड़कर इसके साथ और भी उन्नत हो सकते हैं जो सेल में विभिन्न नियंत्रणों को इंगित करते हैं, इसलिए आपको ViewWithTag का उपयोग करने की भी आवश्यकता नहीं है! –

+0

बिल्कुल भयानक! – Moshe

2

एक खाली निब बनाएं और तालिका आइटम को पहले आइटम के रूप में जोड़ें। इंस्पेक्टर में, आप इंटरफेस बिल्डर में reuseIdentifier स्ट्रिंग जोड़ सकते हैं।

अपने कोड में सेल का उपयोग करने के लिए, ऐसा करते हैं:

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0]; 
    } 

    //set up cell 

    return cell; 
} 

एक और तरीका है जहाँ आप अपने सेल के लिए एक आउटलेट बना सकते हैं और फ़ाइल के मालिक के रूप में नियंत्रक का उपयोग सेल निब लोड नहीं है, लेकिन ईमानदारी से इस बहुत आसान है।

यदि आप निब में सेल में जोड़े गए सबव्यूव्यू तक पहुंचने में सक्षम होना चाहते हैं, तो उन्हें अद्वितीय टैग दें और उन्हें [सेल व्यू विथटैग: एक्स] के साथ एक्सेस करें;

यदि आप सेल पर कस्टम गुण सेट करने में सक्षम होना चाहते हैं, तो आपको एक कस्टम UITableViewCell सबक्लास बनाना होगा, फिर बस इंटरफ़ेसबिल्डर में अपने निब के वर्ग के रूप में सेट करें और UITableViewCell को अपने कस्टम सबक्लास में डालें आप उपरोक्त कोड में इसे हटा दें।

1

यहाँ आप कैसे कर सकते हैं:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName]; 
    if (!cell) 
    { 
    NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil]; 
    cell = [topLevelItems objectAtIndex:0]; 
    } 

    return cell; 
} 

कहाँ ज में cellLoader पालन परिभाषित किया गया है:

UINib *cellLoader; 

और मीटर में (उदाहरण के लिए प्रारंभ के दौरान) के रूप में istantiated है:

cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain]; 

और CellClassName निम्नानुसार एमएम में परिभाषित किया गया है (अलस है ओ आपके xib के लिए नाम)।

static NSString *CellClassName = @"YourCustomeCell"; 

सेल बनाए गए अपने xib में भी स्ट्रिंग CellClassName उपयोग करने के लिए मत भूलना।

अधिक जानकारी के लिए मैं आपको इस शानदार ट्यूटोरियल creating-a-custom-uitableviewcell-in-ios-4 पढ़ने के लिए सुझाव देता हूं।

उम्मीद है कि यह मदद करता है।

पीएस मेरा सुझाव है कि आप UINib का उपयोग करें क्योंकि xib फ़ाइलों को लोड करने के लिए एक अनुकूलित विधि है।

2

एक XIB उपयोग कर एक कस्टम UITableViewCell सेट करने के लिए, आप कई चीजें करना है:

  • अपने हैडर
  • कॉन्फ़िगर इंटरफ़ेस बिल्डर में तालिका दृश्य सेल
  • लोड में एक IBOutlet सेट करें किसी भी अन्य सेल

तो जैसे tableView:cellForRowAtIndexPath:

  • कॉन्फ़िगर इसके अंदर XIB ... चलो एक सेट करें हेडर फ़ाइल में IBOutlet।

    @property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell; 
    

    कार्यान्वयन फ़ाइल के अंदर इसे संश्लेषित करना न भूलें।

    @synthesize dvarTorahCell; 
    

    अब, सेल को बनाएं और कॉन्फ़िगर करें। जैसा कि नीचे दिखाया आप सेल पहचानकर्ता और IBOutlet पर ध्यान देना चाहते हैं:

    enter image description here

    कोड में अब, आप ऊपर XIB अपने सेल में जैसा कि यहाँ दिखाया लोड:

    enter image description here

    ध्यान दें कि इंटरफेस बिल्डर में सेल आइडेंटिफायर नीचे दिए गए कोड में दिखाए गए एक से मेल खाता है।

    फिर आप आगे बढ़ें और अपने सेल को किसी अन्य की तरह कॉन्फ़िगर करें।

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
    
        [[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil]; 
        cell = dvarTorahCell; 
        dvarTorahCell = nil; 
    } 
    
    //configure your cell here. 
    

    बस ध्यान दें कि जब इस तरह के लेबल के रूप में subviews, तक पहुँचने, अब आप उन्हें करने के लिए इस तरह के textLabel और detailTextLabel के रूप में संपत्ति के नाम, के बजाय, टैग द्वारा संदर्भित होनी चाहिए।

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

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