क्या यूआईटेबल व्यू में एकल यूआईटेबल व्यूसेल को रिफ्रेश करना संभव है?


182

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

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

जवाबों:


323

एक बार जब आप अपने सेल का इंडेक्सपाप्ट कर लेते हैं, तो आप कुछ ऐसा कर सकते हैं:

[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
यहां पर नाइटपैकिंग, लेकिन निश्चित रूप से यदि आप केवल एक ही सेल को रिफ्रेश कर रहे थे तो आप शायद [NSArray arrayWithObject:]इसके बजाय उपयोग करना चाहेंगे ।
सिंह कैसरानी

57
इस स्थिति में भी, beginUpdatesऔर endUpdatesअनावश्यक हैं।
कुबि

2
ओपी किसी भी चीज़ को एनिमेट नहीं कर रहा है, इसलिए शुरुआत / एंडअपडेट्स को कॉल करने की कोई आवश्यकता नहीं है
kubi

2
जब तक विधि पिछले सार्वजनिक Xcode संस्करण में पदावनत नहीं कहती है , तब तक सभी iOS संस्करण ठीक होने चाहिए।
अलेजांद्रो इवान

1
@Supertecnoboff सच है, लेकिन कुछ बिंदु पर इसे बदला जा सकता है या इसका व्यवहार बदल जाएगा। यह बेहतर है कि एप्रेजेशन एसेप्स को संभाला जाए
एलेजांद्रो इवान

34

मैंने सिर्फ फोन करने की कोशिश की -[UITableView cellForRowAtIndexPath:], लेकिन यह काम नहीं किया। लेकिन, निम्नलिखित उदाहरण के लिए मेरे लिए काम करता है। मैं allocऔर के लिए तंग स्मृति प्रबंधन।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];
}

क्या [indexPaths रिलीज़] यहाँ आवश्यक है? मुझे लगा कि आपको केवल इस बात की आवश्यकता है कि यदि आप ऑब्जेक्ट को स्वयं आवंटित करते हैं।
powerj1984

4
उसने indexPaths सरणी आवंटित की। लेकिन बेहतर सवाल यह है कि वह क्यों सोचता है कि "चुस्त स्मृति प्रबंधन" आवश्यक है। ऑटोरेलिज यहां पूरी तरह से अच्छा काम करेंगे।
जॉन क्रॉमार्टी

22

स्विफ्ट:

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

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

इस विधि को कहां से करें?
मास्टर AgentX

18

reloadRowsAtIndexPaths:ठीक है, लेकिन फिर भी UITableViewDelegateआग लगाने के तरीकों को मजबूर करेगा ।

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

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

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

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

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

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

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

यह सबसे अच्छा तरीका है क्योंकि यह पुनः लोड करने के लिए विरोध के रूप में शीर्ष पर सभी तरह से स्क्रॉल करने के लिए टेबलव्यू को मजबूर नहीं करता है ।AtIndexPaths: या पुनः लोड करने के तरीके।
ZviBar

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

16

यदि आप कस्टम 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];
}

6

स्विफ्ट 3:

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

4

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

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

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


ग्रेग कहो, वास्तव में उस वाक्य रचना का उदाहरण क्या है, कृपया? धन्यवाद!
फटी

3

यहां स्विफ्ट 5 के साथ एक यूआईटेबल व्यू एक्सटेंशन दिया गया है:

import UIKit

extension UITableView
{    
    func updateRow(row: Int, section: Int = 0)
    {
        let indexPath = IndexPath(row: row, section: section)

        self.beginUpdates()
        self.reloadRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
        self.endUpdates()
    }

}

के साथ बुलाना

self.tableView.updateRow(row: 1)

0

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

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

कीबोर्ड गायब हो गया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.