Раздел перезагрузки UITableView - PullRequest
39 голосов
/ 29 ноября 2011

Я хочу перезагрузить только один раздел, а не полную таблицу.Есть ли какой-либо метод в UITableView.

[tableView reloadData], используемый для загрузки полной таблицы.
Я хочу знать, как загрузить только один раздел, так как у меня в таблице большое количество строк.

Ответы [ 10 ]

69 голосов
/ 29 мая 2012

Меня беспокоит метод 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];
}
34 голосов
/ 29 ноября 2011

Да, есть:

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
24 голосов
/ 22 октября 2012

Но вы можете перезагрузить только те разделы, которые содержат одинаковое количество строк (или вам нужно вручную добавить или удалить их) . В противном случае вы получите:

*** 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].

Когда вам нужно перезагрузить раздел, и вы изменили количество строк внутри него , вы можете использовать что-то вроде этого:

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];
}
12 голосов
/ 17 февраля 2017

Для Swift 3 и Swift 4

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

self.tableView.reloadSections(indexSet, with: .automatic)
6 голосов
/ 04 мая 2016

это правильный путь:

[self.tableView beginUpdates]; 
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
4 голосов
/ 10 апреля 2013

Основываясь на принятом здесь ответе, я создал функцию, которая будет перезагружать все разделы таблицы с использованием анимации. Вероятно, это можно оптимизировать, перезагрузив только видимые разделы.

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

В моем случае мне пришлось вызвать reloadData перед анимацией раздела, потому что базовые данные для таблицы изменились. Однако он оживляет должным образом.

2 голосов
/ 23 августа 2016

Вот метод, вы можете передавать детали раздела по-разному

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

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

Перезагрузка отдельных разделов повышает производительность для табличного представления, а также позволяет избежать некоторых проблем, таких как плавающие / перемещаемые пользовательские колонтитулы в вашем представлении. Поэтому старайтесь по возможности использовать reloadSection чем relayodData

2 голосов
/ 14 августа 2013

Попробуйте использовать

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

Надеюсь, это решит вашу проблему.

2 голосов
/ 29 ноября 2011

Тебе нужно это ... Для строки перезагрузки

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

или Для раздела перезагрузки

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
0 голосов
/ 02 октября 2014

Если у вас есть пользовательский вид сечения, вы можете добавить к нему слабую ссылку в вашем контроллере вида и обновлять его, когда захотите. Вот мой код для справки:

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

Затем вы можете обновить свой раздел следующим образом:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.tableHeaderLabel.text = [NSString stringWithFormat:@"Showing row: %ld", indexPath.row];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...