2012-12-07 11 views
5

जैसे ही स्क्रीन स्क्रीन पर दिखाई नहीं दे रही है, मुझे अधिसूचित होने की आवश्यकता है।आईओएस - दृश्य दृश्य से बाहर निकलने योग्य UITableViewCell का पता लगाएं?

UITableView पहले से ही tableView:didEndDisplayingCell:forRowAtIndexPath: कहा जाता है एक प्रतिनिधि विधि है, लेकिन इस प्रतिनिधि विधि कभी नहीं कहा जाता हो जाता है। और हाँ मेरे पास मेरे UITableView सेट के प्रतिनिधि हैं।

एक सेल का पता लगाने के किसी भी अन्य तरीके से हटाया जा रहा है? मुझे किसी अन्य आइटम द्वारा पुन: उपयोग किए जाने से पहले इस सेल की सामग्री (इनपुट) को सहेजने में सक्षम होना चाहिए।

संपादित करें:

प्रलेखन tableView:didEndDisplayingCell:forRowAtIndexPath: के अनुसार iOS 6 और उच्च API है। आईओएस 5 पर इसे हासिल करने का कोई तरीका है?

+0

आप 'UITableViewDelegate' और सेट तालिका दृश्य के' self' के लिए प्रतिनिधि जोड़ दिया है? –

+0

हां, मैंने विशेष रूप से उल्लेख किया है कि मेरे प्रश्न में :) – aryaxt

+0

आईओएस का कौन सा संस्करण आप परीक्षण कर रहे हैं? –

उत्तर

8

6.0 से अधिक पुराने iOS के संस्करण पर, तालिका दृश्य tableView:didEndDisplayingCell:forRowAtIndexPath: संदेश नहीं भेजता है।

आप UITableViewCell का एक उपवर्ग का उपयोग कर रहे हैं, तो आप didMoveToWindow अधिभावी द्वारा iOS के पुराने संस्करण पर एक ही प्रभाव प्राप्त कर सकते हैं:

- (void)didMoveToWindow { 
    if (self.window == nil) { 
     // I have been removed from the table view. 
    } 
} 

आप अपने सेल एक (कमजोर या unsafe_unretained) संदर्भ वापस देने के लिए आवश्यकता हो सकती है अपनी तालिका में प्रतिनिधियों को देखें ताकि आप प्रतिनिधि को एक संदेश भेज सकें।

हालांकि, अगर आप आईओएस के सभी संस्करणों के लिए केवल didMoveToWindow पर भरोसा नहीं कर सकते हैं। आईओएस 6 से पहले, एक टेबल व्यू हमेशा पुन: उपयोग करने से पहले एक सबव्यूव के रूप में टेबल व्यू सेल को हटा देता है, इसलिए सेल को हमेशा उपयोग करने से पहले didMoveToWindow प्राप्त होगा। हालांकि, आईओएस 6 में शुरू होने पर, एक टेबल व्यू को के बिना उप-दृश्य के रूप में हटाकर किसी सेल का पुन: उपयोग कर सकता है। टेबल व्यू बस सेल के फ्रेम को अपने नए स्थान पर ले जाने के लिए बदल देगा। इसका मतलब है कि आईओएस 6 में शुरू होने पर, एक सेल को पुन: उपयोग करने से पहले हमेशा didMoveToWindow प्राप्त करता है।

तो आपको अपने प्रतिनिधि उप-वर्ग में didMoveToWindow और tableView:didEndDisplayingCell:forRowAtIndexPath: दोनों को अपने प्रतिनिधि में लागू करना चाहिए, और सुनिश्चित करें कि यह दोनों काम करता है या केवल एक कहलाता है।

+0

इसे देखने से पहले मेरा उत्तर पोस्ट किया गया है, इसलिए शायद इसे उत्तर के रूप में स्वीकार किया जाएगा, क्योंकि यह वास्तव में मेरे करीब है और समस्या का समाधान करता है – aryaxt

1
tableView:didEndDisplayingCell:forRowAtIndexPath: 

केवल आईओएस 6 और बाद में उपलब्ध है।

एक तरह से पूरा करने के लिए क्या आप के बाद scrollview प्रतिनिधि तरीकों का उपयोग करने के लिए जब नजर रखने के लिए tableview स्क्रॉल होगा (धीमी यद्यपि)। वहां से, कॉल करें:

NSArray *visiblePaths = [tableView indexPathsForVisibleRows]; 

और दृश्य पथों की सरणी में किसी भी बदलाव की जांच करें।

4

मुझे यकीन है कि तर्क दोनों iOS 5.0 और 6 पर लागू होता है बनाने के लिए नीचे के संयोजन का उपयोग कर समाप्त हो गया।0

सेल लॉजिक

@protocol MyCellDelegate 
- (void)myCellDidEndDisplaying:(MyCell *)cell; 
@end 

@implementation MyCell 

// Does not work on iOS 6.0 
- (void)removeFromSuperview 
{ 
    [super removeFromSuperview]; 

    [self.delegate myCellDidEndDisplaying:(MyCell *)self]; 
} 

@end 

ViewController लॉजिक

@implementation MyViewcontroller 

- (void)myCellDidEndDisplaying:(MyCell *)cell 
{ 
    IndexPath *indexPath = [self.tableView indexPatForCell:cell]; 
    // do stuff 
} 

// Does not work on iOS below 6.0 
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

} 

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