Monday, 15 September 2014

ios - Custom Cell images are changing on their own in a UITableView -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 3 जवाब

मेरे पास तालिका दृश्य है कस्टम कक्ष प्रत्येक सेल में एक छवि, शीर्षक, और विवरण होता है। जब मैं पहली बार टेबल को लोड करता हूं, तो यह ठीक ठीक है। अगर मैं धीरे-धीरे छवियों को खिसकाता हूं, तो भी ठीक काम करने लगता है। जैसे ही मैं तेजी से नीचे स्क्रॉल (जैसे कोशिकाओं की संख्या संभालने के लिए पर्याप्त नहीं है ऊपर और नीचे स्क्रॉल किए बिना फिट) छवियों को एक यादृच्छिक क्रम में कोशिकाओं को बदलने के लिए शुरू कुछ कोशिकाओं में एक ही छवि दो बार है।

किसी भी सुराग क्यों यह हो रहा है

  - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {स्थिर NSString * CellIdentifier = @ "सेल"; बुकमार्ककेलदृश्यदर्शिका * सेल = [तालिकादृश्य] डेक्यूवर पुन: प्रयोज्य सेल विथआईडेंटिफायर: इंडीडेपैथ के लिए सेलआईडेंटिफाइड: इंडेक्सपाथ]; समाचार लेख * currArt = [स्वयं। LN_Dept ऑब्जेक्टऐटइंडेक्स: इंडेक्सपाथ.रो]; अगर (currArt.artImage == शून्य) {अगर ([currArt.mainImage_URL rangeOfString: @ "& lt; img src ="]।! स्थान = NSNotFound) {NSRange रेंज = [currArt.mainImage_URL rangeOfString: @ "& lt; img src = \ "/ CONC /"]; NSString *-स्ट्रिंग = [[currArt.mainImage_URL substringFromIndex: NSMaxRange (रेंज)] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; NSRange सीमा 2 = [सबस्ट्रिंग rangeOfString: @ "\" "]; NSString * substring2 = [[सबस्ट्रिंग substringToIndex: NSMaxRange (सीमा 2) -1] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; NSString * imageURL = [PUB_URL स्ट्रिंगअपने स्ट्रिंगिंग: substring2]; [स्वयं डाउनलोड इमेज विथ url: [एनएसड URL यूआईआरथ्रस्ट्रिंग: छवि यूआरएल] समापनबैंक: ^ (बूल सफल हुआ, यूआईमेज * इमेज) {अगर (सफल) {currArt.artImage = image; Cell.ArtDisplayImage.image = currArt.artImage; }}]; }} और {cell.ArtDisplayImage.image = currArt.artImage; } [सेल कॉन्फ़िगर सेलफ्रेंटएन्टर: करर्ट आर्टिकल]; रिटर्न सेल; } - (शून्य) downloadImageWithURL: (NSURL *) यूआरएल completionBlock: (शून्य (^) (BOOL सफल रहा, UIImage * image)) completionBlock {NSMutableURLRequest * अनुरोध = [NSMutableURLRequest requestWithURL: यूआरएल]; [NSURLConnection sendAsynchronousRequest: अनुरोध कतार: [NSOperationQueue mainQueue] completionHandler: ^ (NSURLResponse * प्रतिक्रिया, NSData * डेटा, NSError * त्रुटि) {if {UIImage * image = [[UIImage alloc] initWithData (त्रुटि!): डेटा]; completionBlock (हाँ, छवि); } और {पूरा बॉल (नं, शून्य); }}]; }  

ऐसा इसलिए होता है क्योंकि आपको यह समझ में नहीं आता कि कैसे UITableView काम करता है मान लीजिए कि आपके तालिका दृश्य में 100 कोशिकाएं हैं और यह एक साथ 10 कोशिकाओं को प्रदर्शित कर सकती हैं। जब तालिका दृश्य लोड होता है, तो यह आपके कक्षों के 10 उदाहरण बनाता है। जब आप तालिका दृश्य के माध्यम से नीचे स्क्रॉल करना शुरू करते हैं तो यह वास्तव में आपके कक्षों के नए उदाहरणों को नहीं बनाता है - यह स्क्रीन से गायब हो जाने वाले पुनः उपयोग की गई कोशिकाओं (क्योंकि आप [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath]; )। इसका मतलब यह है कि सूचकांक 10 में सेल का एक ही संदर्भ होगा जो कि सूचकांक 0 पर सेल होगा। आपके प्रश्न पर वापस आप

  [self downloadImageWithURL: [NSURL URLWithString: ImageURL] पूर्णताः लॉक: ^ (बुल सफल, यूआईमेज * छवि) {if (सफल) {currArt.artImage = image; Cell.ArtDisplayImage.image = currArt.artImage; }}];  

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


No comments:

Post a Comment