2013-07-16 9 views
5

चलो कहते हैं कि मेरे पास है कि चलोकस्टम कोशिकाओं के लिए dequeueReusableCellWithIdentifier का उपयोग

- (UITableViewCell*)tableView:(UITableView*) cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    static NSString *cellID = @"Cell Identifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 

    if (!cell) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 
    else 
    { 
     return cell; 
    } 

    UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, 15, box.size.width, 19.0f)]; 
    nameLabel.text = name; 
    [nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]]; 
    [nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]]; 
    [nameLabel setBackgroundColor: [UIColor clearColor]]; 
    nameLabel.textAlignment = NSTextAlignmentCenter; 
    [cell addSubview: nameLabel]; 
} 

क्या है कि क्या करने जा रहा है?

यदि सेल शून्य नहीं है, और मान लें कि आप पंक्ति 5 पर हैं, तो क्या यह पंक्ति 5 के लिए सटीक पाठ लेबल आदि के साथ सेल वापस कर देगा?

असल में, मेरा प्रश्न यह है कि यदि आपके पास लेबल, छविदृश्य आदि के साथ कस्टम कक्ष हैं, तो आप cellForRowAtIndexPathdequeueReusableCellWithIdentifier के साथ कैसे उपयोग करते हैं?

+0

यह tableviewcell के लिए समान है चाहे वह कस्टम है या नहीं। आप सेल ऑब्जेक्ट को पकड़ते हैं और अपने सभी राज्यों को रीसेट करते हैं और फिर अपनी सामग्री जोड़ते हैं। तो हाँ, आपको लेबल/छवियों में सामग्री को साफ करना होगा (इसे शून्य पर सेट करके) और नई सामग्री प्रदान करें। – rydgaze

+1

इस कोड में, सेल के सबव्यूज़ को समझाकर UILabel ऑब्जेक्ट को फिर से एक्सेस करने का कोई तरीका नहीं है जो बहुत बदसूरत है। UITableViewCell के उप-वर्ग का उपयोग करने के लिए बेहतर है जिसमें UILabel प्रॉपर्टी है, इसलिए यह आसानी से सुलभ हो सकता है –

उत्तर

0

हां, एक सेल को हटाकर जिसे आपने पहले से ही उन लेबलों को जोड़ दिया है, उनके पास अभी भी उन्हें और उनके पाठ के समान ही होगा जब आपने उस विशेष सेल को बनाया था।

एक UITableViewCell सबक्लास बनाएं, चलिए इसे MyTableViewCell कहते हैं जिसमें गुण/लेबल दृश्य/इत्यादि रखने वाले गुण हैं। एक बार जब आप या तो अपने MyTableViewCell में से किसी एक को हटा दिया है या आवंटित किया है, तो आप इन गुणों पर टेक्स्ट/छवियों/आदि सेट कर सकते हैं। इस तरह:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"identifier"; 

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[MyTableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:CellIdentifier]; 
    } 



    cell.nameLabel.text = name; 
    cell.imageView.image = anImage; 


    return cell; 
} 

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

संपादित करें: एक महत्वपूर्ण बात जो मैंने छोड़ी है, आप अपने सेल के गुणों को initWithStyle: reuseIdentifier: विधि में तुरंत चालू कर देंगे और उन्हें सेल में सबव्यूव के रूप में जोड़ देंगे। ऐसा तब होता है जब आप अपने cellForRowAtIndexPath विधि में लेबल (या जो कुछ भी) के पाठ को सेट करने के लिए जाते हैं, यह पहले से ही बनाया जा चुका है। असल में सेल अपने स्वयं के विचारों का प्रबंधन करता है और UITableView प्रतिनिधि को डेटा के साथ उन विचारों को भरने के बारे में चिंता करना पड़ता है।

3

आप एक सेल को हटाने का प्रयास करते हैं। यदि प्रयास विफल हुआ (सेल शून्य है), तो आप एक सेल बनाते हैं और इसे इसके विचारों को कॉन्फ़िगर करते हैं (दृश्य के अंदर डेटा नहीं)। इसके बाद, आप सेल-टू-सेल को बदलने वाले किसी भी डेटा या सेटिंग्स के साथ विचारों को पॉप्युलेट करते हैं। साथ ही, आपको सेल के contentView पर कोई भी कस्टम दृश्य नहीं जोड़ना चाहिए, न कि सेल स्वयं।

#define NAME_LABEL_TAG 1234 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellID = @"Cell Identifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, 15, box.size.width, 19.0f)]; 
     nameLabel.tag = NAME_LABEL_TAG; 
     [nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]]; 
     [nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]]; 
     [nameLabel setBackgroundColor: [UIColor clearColor]]; 
     nameLabel.textAlignment = NSTextAlignmentCenter; 
     [cell.contentView addSubview: nameLabel]; 
    } 

    // Populate views with data and retrieve data for "name" variable 
    UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:NAME_LABEL_TAG]; 
    nameLabel.text = name; 

    // Return fully configured and populated cell 
    return cell; 
} 

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

+10

आपको अवगत होना चाहिए कि यदि आप स्टोरीबोर्ड में अपना सेल बनाते हैं, तो dequeueReusableCellWithIdentifier: सेल को वापस करने की गारंटी है, इसलिए आपका if (! सेल) क्लॉज होगा कभी मत दौडना। – rdelmar

+0

क्या आप nameLabel.text = name को कॉल कर सकते हैं; भले ही नाम लेबल न हो, जब सेल शून्य न हो। –

+0

नाम लेबल 'if (! सेल)' के दायरे से बाहर हो जाएगा। लेबल प्राप्त करने के लिए आपको viewWithTag का उपयोग करना चाहिए। –

0

UITableView हो सकता है आप अपेक्षित कोशिकाओं की संख्या के लिए। फिर यह लोड होता है - tableView: cellForRowAtIndexPath: विधि कक्ष जो प्रदर्शित किया जाएगा + कुछ स्क्रॉलिंग चिकनी करने के लिए, अधिक ऑब्जेक्ट्स यह नहीं बनाते हैं। टेबल व्यू में संग्रहीत ऑब्जेक्ट्स (उपयोगकर्ता द्वारा) बनाया गया है और आप डेक्यू रीयूसेबल कैलविथ इंडेंटिफायर: विधि के माध्यम से उपयोग नहीं कर सकते हैं। TableView वर्तमान में बनाए गए सेल को स्क्रॉल करते समय संशोधित करने के लिए उपयोगकर्ता से पूछता है। यदि यहां नि: शुल्क वस्तु है - इसे डेक्यू से ले जाएं ReusableCellWithIdentifier: दूसरा - नया बनाएं।

0

प्रत्येक तालिका कक्ष आवंटित करने के लिए, केवल एक तालिका आवश्यक है आवंटित करता है। यदि केवल 8 कोशिकाएं किसी पृष्ठ पर फिट होती हैं तो तालिका दृश्य केवल 8 कक्षों को आवंटित करेगा या 9 मुझे याद नहीं है कि इसमें पैडिंग है या नहीं। जब आप कोई टेबलव्यू स्क्रॉल करते हैं और सेल पृष्ठ से बाहर जाता है तो सेल को फिर से उपयोग करने के लिए कतारबद्ध किया जाता है, एक नए सेल को फिर से आवंटित करने के बजाय तालिका दृश्य एक मौजूदा लेता है, इस प्रक्रिया को डेक्यू-आईएनजी कहा जाता है।जब आप अपनी कोशिकाओं को बनाते/आवंटित करते हैं तो आप इसे पहचानकर्ता देते हैं, यह पहचानकर्ता उस स्ट्रिंग के साथ चिह्नित सेल को पुनर्प्राप्त करने के लिए उपयोग किया जाता है।

0

आप उपयोग कर सकते हैं इस

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath 

यह उपलब्ध है IOS 6

के बाद या फिर आप भी viewDidLoad में कहीं अपनी कक्षा रजिस्टर कर सकते हैं और प्रयोग ResuseIdentifier है, तो आप ResuseIdentifier लिखने की जरूरत नहीं है CellForRowAtIndexpath में भाग

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0) 

आशा इस मदद करता है ...

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