2011-11-29 13 views
34

मैं केवल एक अनुभाग को फिर से लोड करना चाहता हूं पूर्ण तालिका नहीं। UITableView में कोई विधि है।UITableView रीलोड अनुभाग

[tableView reloadData] पूर्ण तालिका लोड करने के लिए उपयोग किया जाता है।
मैं जानना चाहता हूं कि केवल एक सेक्शन को कैसे लोड किया जाए, क्योंकि मेरे पास तालिका में बड़ी संख्या में पंक्तियां हैं।

+2

कॉलिंग reloadData अभी तक केवल शुरू में UITableViewCells कि की स्क्रीन –

+0

संभव डुप्लिकेट पर हैं पुनः लोड होगा http://stackoverflow.com/ reloadSection उपयोग करने का प्रयास प्रश्न/3485162/पुनः लोडिंग-केवल-एक-uitableviewcell-on-a-uitableview –

+0

आपकी मदद के लिए थेंक्स स्टीव नौकरियां –

उत्तर

30

हाँ, वहाँ है:

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
2

आप इस ... पुनः लोड के लिए पंक्ति

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

या के लिए पुनः लोड खंड

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
66

reloadSections विधि कीड़े मुझे जरूरत है - क्योंकि मुझे कुछ वस्तुओं का निर्माण करना है। यदि आपको लचीलापन की आवश्यकता है तो यह बहुत अच्छा है, लेकिन कभी-कभी मैं भी सादगी चाहता हूं। यह इस प्रकार है:

NSRange range = NSMakeRange(0, 1); 
NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];          
[self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone]; 

यह पहला खंड पुनः लोड करेगा। मैं UITableView पर एक वर्ग इस विधि का उपयोग करने के लिए और सिर्फ फोन पसंद करते हैं:

[self.tableView reloadSectionDU:0 withRowAnimation:UITableViewRowAnimationNone]; 

मेरे श्रेणी विधि इस प्रकार है:

@implementation UITableView (DUExtensions) 

- (void) reloadSectionDU:(NSInteger)section withRowAnimation:(UITableViewRowAnimation)rowAnimation { 
    NSRange range = NSMakeRange(section, 1); 
    NSIndexSet *sectionToReload = [NSIndexSet indexSetWithIndexesInRange:range];          
    [self reloadSections:sectionToReload withRowAnimation:rowAnimation]; 
} 
+1

@ कार्यान्वयन फ़ंक्शन से प्यार करें! इसे बहुत आसान बनाने के लिए धन्यवाद – portforwardpodcast

+0

मैं इसे काम पर नहीं ला सकता। – Jason

+0

@Jason क्या आपने अपनी खुद की श्रेणियां पहले बनाई हैं? इसके अलावा, क्या आपने वोट दिया? – bandejapaisa

21

लेकिन आप केवल वर्गों जो पंक्तियोंकी उतनी ही संख्या में होते हैं पुनः लोड कर सकते (या आपको उन्हें मैन्युअल रूप से जोड़ना या निकालना है)। नहीं तो आप मिल जाएगा:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 2. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

कौन सा की आवश्यकता नहीं है जब आप [tableView reloadData] का उपयोग करें। आप एक वर्ग (bandejapaisa शो की तरह) में डालते हैं तो

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section]; 

[self beginUpdates]; 
    [self deleteSections:indexSet withRowAnimation:rowAnimation]; 
    [self insertSections:indexSet withRowAnimation:rowAnimation]; 
[self endUpdates]; 

यह:

जब आप और एक वर्ग को फिर से लोड करने की आवश्यकता है आप अंदर यह पंक्तियों की संख्या को बदल दिया है, तो आप कुछ इस तरह इस्तेमाल कर सकते हैं इस तरह दिख सकता है:

- (void)reloadSection:(NSInteger)section withRowAnimation:(UITableViewRowAnimation)rowAnimation { 
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section]; 

    [self beginUpdates]; 
     [self deleteSections:indexSet withRowAnimation:rowAnimation]; 
     [self insertSections:indexSet withRowAnimation:rowAnimation]; 
    [self endUpdates]; 
} 
+0

दुर्भाग्य से यह मेरे लिए काम नहीं कर सकता है। –

+0

और किस मामले में? अब केवीओ का उपयोग करने के लिए बेहतर दृष्टिकोण हो सकता है (और इस प्रकार कुछ मॉडल में बदलावों के आधार पर स्वत: UITableView रीलोडिंग की विश्वसनीयता प्राप्त होती है) - या यदि आप CoreData का उपयोग करते हैं तो आपको NSFetchResultsController में रुचि हो सकती है। – Inza

4

यहां स्वीकृत उत्तर के आधार पर, मैंने एक ऐसा फ़ंक्शन बनाया जो एनीमेशन का उपयोग करके तालिका में सभी अनुभागों को फिर से लोड करेगा। यह शायद केवल दृश्यमान खंडों को पुनः लोड करके अनुकूलित किया जा सकता है।

[self.tableView reloadData]; 
NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:self.tableView]); 
NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range]; 
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade]; 

मेरे मामले में, मैं, इससे पहले कि खंड एनीमेशन एक reloadData मजबूर करने के लिए, क्योंकि मेज के लिए अंतर्निहित डेटा बदल गया था था। हालांकि यह ठीक से एनिमेट करता है।

2

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

आशा इससे आपकी समस्या का समाधान होगा उपयोग करने के लिए प्रयास करें।

0

यदि आपके पास कस्टम सेक्शन व्यू है तो आप इसे अपने व्यू कंट्रोलर में कमजोर संदर्भ जोड़ सकते हैं और जब चाहें इसे अपडेट कर सकते हैं।

@property (weak, nonatomic) UILabel *tableHeaderLabel; 

.... 

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    UITableViewHeaderFooterView *myHeader = [[UITableViewHeaderFooterView alloc] init]; 

    UILabel *titleLabel = [[UILabel alloc] init]; 
    [titleLabel setFrame:CGRectMake(20, 0, 280, 20)]; 
    [titleLabel setTextAlignment:NSTextAlignmentRight]; 
    [titleLabel setBackgroundColor:[UIColor clearColor]]; 
    [titleLabel setFont:[UIFont systemFontOfSize:12]]; 

    [myHeader addSubview:titleLabel]; 

    self.tableHeaderLabel = titleLabel; //save reference so we can update the header later 

    return myHeader; 
} 

फिर बाद में आप इस तरह अपने अनुभाग को अपडेट कर सकते हैं::,

[self.tableView beginUpdates]; 
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 
6

सही तरीका है कि यहाँ संदर्भ के लिए मेरी कोड है विभिन्न तरीकों से सेक्शन विवरण पास कर सकते हैं

[self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:NO]; 

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone]; 

विशेष अनुभागों को फिर से लोड करने से टेबल व्यू के प्रदर्शन में सुधार होता है और साथ ही कुछ समय यह आपके विचार में फ़्लोटिंग/मूविंग कस्टम हेडर-फ़ूटर जैसे कुछ मुद्दों से भी बचता है। अतः relaodData से जब भी संभव हो

2

यहाँ विधि है आप:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.tableHeaderLabel.text = [NSString stringWithFormat:@"Showing row: %ld", indexPath.row]; 
} 
6

स्विफ्ट 3 और स्विफ्ट के लिए 4

let sectionToReload = 1 
let indexSet: IndexSet = [sectionToReload] 

self.tableView.reloadSections(indexSet, with: .automatic) 
संबंधित मुद्दे