2011-11-29 23 views
34

Chcę przeładować tylko jedną sekcję, a nie pełną tabelę. Czy istnieje jakakolwiek metoda w UITableView.Załaduj ponownie sekcja UITableView

[tableView reloadData] służy do ładowania pełnego stołu.
Chcę wiedzieć, jak załadować tylko jedną sekcję, ponieważ mam dużą liczbę wierszy w tabeli.

+2

Wywołanie reloadData jeszcze tylko początkowo przeładować UITableViewCells które są na ekran –

+0

możliwym duplikatu http://stackoverflow.com/ pytania/3485162/reloading-only-one-uitableviewcell-on-a-uitableview –

+0

thanx steve jobs for ur help –

Odpowiedz

30

Tak, jest:

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

potrzebujesz tego ... Dla Reload Row

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

lub Dla Odśwież sekcja

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

Sposób ten reloadSections bugs me - ponieważ muszę skonstruować kilka obiektów. To jest świetne, jeśli potrzebujesz elastyczności, ale czasami też chcę po prostu prostoty. To wygląda następująco:

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

Spowoduje to ponowne załadowanie pierwszej sekcji. Wolę mieć kategorię na UITableView i po prostu wywołanie tej metody:

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

Moja metoda kategorii wygląda następująco:

@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

Uwielbiam funkcję @implementation! Dzięki za uczynienie tego tak prostym – portforwardpodcast

+0

Nie mogę tego zrobić. – Jason

+0

@Jason Czy stworzyłeś wcześniej własne kategorie? Czy głosowałeś w dół? – bandejapaisa

21

Ale można przeładować tylko sekcje, które zawierają tę samą liczbę wierszy(lub musisz ręcznie dodać lub usunąć). W przeciwnym wypadku dostaniesz:

*** 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).'

co nie jest wymagane w przypadku korzystania [tableView reloadData].

Kiedy trzeba przeładować sekcję i zmieniły liczbę wierszy wewnątrz niego, można użyć coś takiego:

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section]; 

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

Jeśli umieścisz go w kategorii (jak pokazuje bandejapaisa) go może wyglądać tak:

- (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

Niestety to nie działa dla mnie. –

+0

A w takim przypadku? Teraz lepszym podejściem może być użycie KVO (a tym samym otrzymanie możliwości automatycznego przeładowania UITableView na podstawie zmian w jakimś modelu) - lub jeśli używasz CoreData, możesz być zainteresowany NSFetchResultsController. – Inza

4

Na podstawie zaakceptowanej tutaj odpowiedzi utworzyłem funkcję, która przeładuje wszystkie sekcje w tabeli za pomocą animacji. Można to prawdopodobnie zoptymalizować, ponownie ładując tylko widoczne sekcje.

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

W moim przypadku musiałem wymusić ponowne załadowanie danych przed animacją sekcji, ponieważ podstawowe dane dla tabeli uległy zmianie. Jednak animuje się prawidłowo.

2

Spróbuj użyć

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

nadzieję, że to rozwiąże problem.

0

Jeśli masz niestandardowy widok przekroju, możesz dodać słabe odniesienie do niego w kontrolerze widoku i zaktualizować go, kiedy tylko chcesz.Oto mój kod dla odniesienia:

@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; 
} 

Następnie później można zaktualizować sekcję tak:

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

że poprawny sposób:

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

Oto metoda, ty może przekazywać szczegóły sekcji na różne sposoby:

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

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

Ponowne ładowanie poszczególnych sekcji poprawia wydajność widoku tabeli, a także pozwala uniknąć niektórych problemów, takich jak pływające/ruchome niestandardowe nagłówki-stopki w widoku. Więc spróbuj użyć reloadSection niż relaodData miarę możliwości

6

Dla Swift Swift 3 i 4

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

self.tableView.reloadSections(indexSet, with: .automatic) 
Powiązane problemy