uitableview - TableView सेल पुन: उपयोग और अवांछित चेकमार्क-यह मुझे मार रहा है



reusability checkmark (1)

सेल पुनः उपयोग करना मुश्किल हो सकता है लेकिन आपको दो चीजों को ध्यान में रखना होगा:

  • एक प्रकार की सेल के लिए एक पहचानकर्ता का उपयोग करें - एक तालिका दृश्य में अलग-अलग UITableViewCell-subclasses का उपयोग करते समय एकाधिक आइडेंटिफ़ायर का उपयोग करना वास्तव में आवश्यक होता है और आपको अलग-अलग कक्षों के लिए उनके अलग व्यवहार पर भरोसा करना पड़ता है
  • आपके द्वारा उपयोग किया जाने वाला सेल किसी भी स्थिति में हो सकता है, जिसका अर्थ है कि आपको सेल के प्रत्येक पहलू को फिर से कॉन्फ़िगर करना होगा - खासकर चेकमार्क / चित्र / टेक्स्ट / एक्सेसरीविज़िव / सहायक प्रकार और अधिक

आपको अपने चेकमार्क स्थितियों के लिए एक भंडारण बनाने की आवश्यकता है - बुल (या एनएसएआरयू युक्त बुलियन एनएसएनम्बर ऑब्जेक्ट वाले क्रमशः) को एक सरल सरणी क्रमशः करना चाहिए। तब जब आपको निम्न उपयोग के लिए सेल का उपयोग / पुन: उपयोग करना होगा:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *reuseIdentifier = @"MyCellType";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if(cell == nil) {
        /* create cell here */
    }
    // Configure cell now
    cell.textLabel.text = @"Cell text"; // load from datasource
    if([[stateArray objectAtIndex:indexPath.row] boolValue]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}

तो आपको नल पर प्रतिक्रिया करना होगा:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [stateArray replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:![[stateArray objectAtIndex:indexPath.row] boolValue]]];
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

बस अपने डेटा स्टोर के लिए NSMutableArray का उपयोग करना याद रखें;)


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

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

एप्पल के पास एक उदाहरण प्रोजेक्ट है जिसे टचसेल कहा जाता है, जिसे आप देव केंद्र से डाउनलोड कर सकते हैं, जो बाएं पर एक छवि नियंत्रण के साथ एक कस्टम सेल का उपयोग करके एक चेकमार्क सेट करने का एक अलग तरीका दिखा सकता है। प्रोजेक्ट म्यूट करने योग्य सरणी के स्थान पर एक डेटा स्रोत के लिए एक शब्दकोश ऑब्जेक्ट का उपयोग करता है, इसलिए प्रत्येक आइटम के लिए एक स्ट्रिंग मान और bool चेक किए गए मान है। इस बूल चेक किए गए मान को चेकमार्क सेट करना चाहिए ताकि वह चयनित आइटम को ट्रैक कर सके। यह नमूना प्रोजेक्ट भी इस नासमझ व्यवहार को प्रदर्शित करता है जैसे ही आप TableView को 15+ कोशिकाओं के साथ पॉप्युलेट करते हैं। कक्षों का पुन: उपयोग अवांछित जांच चिह्नों को सेट करना शुरू करता है

मैंने प्रत्येक सेल के लिए वास्तव में अनन्य सेल आइडेंटिफायर का उपयोग करने के साथ प्रयोग करने का प्रयास किया है। इसलिए "एसेल" जैसे कुछ सेल वाले प्रत्येक सेल के बजाय मैंने एक स्थिर इंट का इस्तेमाल किया, स्ट्रिंग के लिए डाली ताकि कोशिकाओं को @ "सेल 1", @ "सेल 2" आदि प्राप्त हो। हालांकि परीक्षण के दौरान, मैं देख सकता था कि सैकड़ों नई कोशिकाओं स्क्रॉलिंग के दौरान जेनरेट किया गया, भले ही मेज में केवल 30 आइटम थे

यह चेकमार्क दोहराने की समस्या को ठीक करता है, लेकिन मुझे संदेह है कि मेमोरी उपयोग बहुत अधिक रास्ते पर जा रहा था।

ऐसा लगता है कि वर्तमान में कोशिकाओं जो कोशिकाओं के देखने योग्य क्षेत्र में नहीं हैं, उन्हें फिर से बनाया जाता है जब वे दृश्य में वापस स्क्रॉल करते हैं

क्या किसी को भी इस परेशान व्यवहार के लिए एक सुरुचिपूर्ण समाधान के साथ आया है?





checkmark