2010-12-15 8 views
163

मेरे पास UITableViewCell एस का उपयोग कर एक कस्टम UITableView है। प्रत्येक UITableViewCell में 2 बटन हैं। इन बटनों पर क्लिक करने से सेल में UIImageView में एक छवि बदली जाएगी।क्या UITableView में एक एकल UITableViewCell को रीफ्रेश करना संभव है?

क्या नई छवि को प्रदर्शित करने के लिए प्रत्येक सेल को अलग से रीफ्रेश करना संभव है? किसी भी मदद की सराहना की है।

उत्तर

297

एक बार जब आप अपने सेल की indexPath है, तो आप की तरह कुछ कर सकते हैं:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

Xcode 4.6 में और ऊपर:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

आप सेट कर सकते हैं जो कुछ भी एनीमेशन प्रभाव के रूप में अपने तरह, की पाठ्यक्रम।

+4

nitpicking यहाँ, लेकिन निश्चित रूप से आप केवल एक ही सेल आप शायद का उपयोग करना चाहें ताज़ा कर रहे थे '[NSArray arrayWithObject:]' बजाय। –

+49

इसके अलावा, इस स्थिति में, 'startUpdates' और' endUpdates' अनावश्यक हैं। – kubi

+0

@ कुबी हाय, क्या आप समझा सकते हैं कि वे क्यों जरूरी नहीं हैं? – Unheilig

31

मैंने केवल -[UITableView cellForRowAtIndexPath:] पर कॉल करने का प्रयास किया, लेकिन यह काम नहीं किया। लेकिन, उदाहरण के लिए मेरे लिए निम्नलिखित काम करता है। कस मेमोरी प्रबंधन के लिए और releaseNSArray

- (void)reloadRow0Section0 { 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; 
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 
    [indexPaths release]; 
} 
+0

क्या [इंडेक्सपाथ रिलीज] आवश्यक है? मैंने सोचा कि आपको केवल तभी जरूरी है जब आपने ऑब्जेक्ट को आवंटित किया हो। – powerj1984

+3

उन्होंने इंडेक्सपैथ सरणी आवंटित की। लेकिन बेहतर सवाल यह है कि वह क्यों सोचता है कि "तंग स्मृति प्रबंधन" आवश्यक है। Autorelease नौकरी पूरी तरह से यहाँ अच्छी तरह से करेंगे। –

4

बस आईओएस 6 में नई शाब्दिक वाक्य रचना के साथ थोड़ा इन उत्तरों को अद्यतन करने - आप उपयोग कर सकते हैं पथ = @ [indexPath] एक वस्तु के लिए, या पथ = @ [indexPath1, indexPath2, ...] कई वस्तुओं के लिए।

व्यक्तिगत रूप से, मुझे सरणी और शब्दकोशों के लिए शाब्दिक रूप से उपयोगी और बड़े समय के बचत के लिए शाब्दिक वाक्यविन्यास मिला है। एक चीज़ के लिए पढ़ना आसान है। और यह किसी भी बहु-ऑब्जेक्ट सूची के अंत में एक शून्य की आवश्यकता को हटा देता है, जो हमेशा एक निजी बगबू रहा है। हम सभी के पास झुकाव करने के लिए हमारी विंडमिल्स है, हां? ;-)

बस सोचा कि मैं इसे मिश्रण में फेंक दूंगा। आशा करता हूँ की ये काम करेगा।

+0

ग्रेग कहें, वास्तव में उस वाक्यविन्यास का उदाहरण क्या है, कृपया? धन्यवाद! – Fattie

15

आप कस्टम TableViewCells का उपयोग कर रहे हैं, तो सामान्य

[self.tableView reloadData];  

प्रभावी रूप से इस सवाल का जब तक आप वर्तमान दृश्य छोड़ने के लिए और वापस आने के उत्तर नहीं देता। न तो पहला जवाब है। निम्नलिखित ताज़ा विधि जो ताकि आप कस्टम पुनः लोड कर सकते केवल उपरोक्त विधि करने के लिए कॉल

//For iOS 5 and later 
- (void)reloadTopCell { 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; 
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 
} 

सम्मिलित:

सफलतापूर्वक विचारों स्विच किए बिना अपना पहला तालिका दृश्य सेल को फिर से लोड करने के लिए निम्न कोड का उपयोग शीर्ष सेल (या पूरी तालिका दृश्य यदि आप चाहें):

- (void)refresh:(UIRefreshControl *)refreshControl { 
    //call to the method which will perform the function 
    [self reloadTopCell]; 

    //finish refreshing 
    [refreshControl endRefreshing]; 
} 

अब आप कि, हल कर अपने viewDidLoad जोड़ने के अंदर है निम्नलिखित:

//refresh table view 
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; 

[self.tableView addSubview:refreshControl]; 

अब आपके पास कस्टम रीफ्रेश टेबल सुविधा है जो शीर्ष सेल को फिर से लोड करेगी। पूरी तालिका को फिर से लोड करने के लिए,

[self.tableView reloadData]; अपनी नई रीफ्रेश विधि में जोड़ें।

//ensure that it reloads the table view data when switching to this view 
- (void) viewWillAppear:(BOOL)animated { 
    [self.tableView reloadData]; 
} 
17

स्विफ्ट::

आप डेटा हर बार जब आप दृश्य स्विच को फिर से लोड करना चाहते हैं, विधि को लागू

func updateCell(path:Int){ 
    let indexPath = NSIndexPath(forRow: path, inSection: 1) 

    tableView.beginUpdates() 
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations 
    tableView.endUpdates() 
} 
18

reloadRowsAtIndexPaths: ठीक है, लेकिन अभी भी आग UITableViewDelegate तरीकों बाध्य करेगा।

सरल दृष्टिकोण मैं कल्पना कर सकते हैं:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
[self configureCell:cell forIndexPath:indexPath]; 

यह महत्वपूर्णreloadData साथ मुख्य थ्रेड पर अपने configureCell: कार्यान्वयन (वही कहानी आह्वान करने के लिए, के रूप में यह अभ्यस्त गैर यूआई धागा पर काम/reloadRowsAtIndexPaths:)। कभी कभी यह जोड़ने के लिए उपयोगी हो सकता है:

dispatch_async(dispatch_get_main_queue(),^
{ 
    [self configureCell:cell forIndexPath:indexPath]; 
}); 

यह भी काम है कि वर्तमान में दृश्यमान दृश्य के बाहर किया जा जाएगा से बचने के लिए योग्य है:

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound; 
if (cellIsVisible) 
{ 
    .... 
} 
+0

आप प्रतिनिधि को क्यों नहीं बुलाएंगे? – kernix

+0

यह सबसे अच्छा तरीका है क्योंकि यह reloadRowsAtIndexPaths: या reloadData विधियों के विपरीत शीर्ष पर स्क्रॉल करने के लिए तालिकादृश्य को मजबूर नहीं करता है। – ZviBar

+0

मैंने ऐसा किया और इस तथ्य से पकड़ा गया कि सेल का पुनर्नवीनीकरण किया गया था –

5

स्विफ्ट 3:

tableView.beginUpdates() 
tableView.reloadRows(at: [indexPath], with: .automatic) 
tableView.endUpdates() 
0

मैं अपग्रेड सेल की आवश्यकता है लेकिन मैं कीबोर्ड बंद करना चाहता हूं। अगर मैं

let indexPath = NSIndexPath(forRow: path, inSection: 1) 
tableView.beginUpdates() 
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations 
tableView.endUpdates() 

का उपयोग कुंजीपटल गायब

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