2009-06-15 1 views
16

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

Row    indexPath.row 
0     0   //view loads and table appears 
1     1,2  //user scrolls to second cell. cellForRowAtIndexPath fires twice. First time indexPath.row is one and second time it is two. This causes cell two's name to display in the label, rather than cell one. 
2     2,3 
3     3 
//user starts scrolling back to first cell 
2     1,2 
1     1,0 
0     0 

मैं पता लगाने के लिए अगर मैं एक मध्य पंक्ति में कर रहा हूँ एक NSDate वस्तु का उपयोग निर्धारित कर सकते हैं: मैं उस पंक्ति के लिए cellForRowAtIndexPath आग के रूप में क्रम में अनुक्रमित सूचीबद्ध किया है। वर्तमान के साथ पिछले समय diffing करके, मुझे पता चलेगा। हालांकि, यदि उपयोगकर्ता कोशिकाओं के माध्यम से वास्तव में तेजी से स्क्रॉल करता है, तो शायद यह काम नहीं करता है। क्या ऐसा करने का कोई और तरीका है?

मैंने दृश्यमान गुणों की विविधताओं का उपयोग करने का प्रयास किया है लेकिन यह काम नहीं करता है। UITableView अगले सेल को लोड करेगा, भले ही यह दिखाई न दे, जिससे यह दृश्य कक्षों का हिस्सा बन जाए।

उत्तर

44

ठीक है, बंद मौका है कि आप एक समाधान पता लगा, या जो कोई भी इस सवाल का अगले आता है के लिए कभी नहीं पर, मैं तुम्हें इस सवाल का जवाब आप के लिए देख रहे थे के साथ प्रदान करेंगे। UITableView indexPaths आप देख रहे हैं के साथ प्रदान करेगा, और फिर UITableView खुशी से कोशिकाओं है कि उन लोगों के सूचकांक पथ से मेल प्रदान करेगा:

UITableView *tableView = self.tableView; // Or however you get your table view 
NSArray *paths = [tableView indexPathsForVisibleRows]; 

// For getting the cells themselves 
NSMutableSet *visibleCells = [[NSMutableSet alloc] init]; 

for (NSIndexPath *path in paths) { 
    [visibleCells addObject:[tableView cellForRowAtIndexPath:path]]; 
} 

// Now visibleCells contains all of the cells you care about. 
+1

इस के साथ ही समस्या ... है कि वे हल नहीं कर रहे हैं उनमें से सॉर्ट, या सही क्रम में सरणी के लिए उन्हें जोड़ने के लिए एक त्वरित एक आसान तरीका है? –

+0

+1 यह मेरा प्रश्न भी उत्तर देता है। –

+21

आप [tableView visualCells] के साथ दृश्यमान कक्ष भी प्राप्त कर सकते हैं; – George

2

जब UITableView सेल का अनुरोध करता है, तो ध्यान केंद्रित करने के बजाय, आपको सेल को प्रदर्शित करने पर ध्यान देना चाहिए, जो प्रतिनिधि विधि tableView:willDisplayCell:forRowAtIndexPath द्वारा इंगित किया गया है।

+0

willDisplayCell मेरे द्वारा पोस्ट किए गए एक ही परिणाम का उपयोग करता है। – 4thSpace

2

स्विफ्ट में बदल दिया डगलस उदाहरण:

let tableView = self.tableView // Or however you get your table view 
let paths = tableView.indexPathsForVisibleRows 

// For getting the cells themselves 
let visibleCells : NSMutableSet = [] 

for path in paths! { 
    visibleCells.addObject(tableView.cellForRowAtIndexPath(path)!) 
} 
0

सरल और UITableView के दृश्य कोशिकाओं को पुनः प्राप्त करने सुरुचिपूर्ण तरीका, indexpath मूल्यों

NSArray * visibleCells = tableView.visibleCells; 
NSLog(@"Total visible Cells: %i", [visibleCells count]); 

तोका उपयोग करके दिखाई कोशिकाओं प्राप्त करने के लिए कोई जरूरत नहींकी दृश्य कोशिकाओं की आवश्यकता है

NSArray * paths = [tableView indexPathsForVisibleRows];