Обновить заголовок раздела TableView после обновления ячейки

Привет, надеюсь, кто-то может помочь.

В настоящее время у меня есть табличное представление с набором разделов, в моем titleForHeaderInSection я возвращаю строку, которая включает сумму значений, содержащихся в ячейках раздела, для отображения в заголовке раздела. Это нормально, но когда я обновляю значение ячейки, я хочу, чтобы titleForHeaderInSection обновлял и обновлял мою сумму значений. На данный момент пользователю нужно прокрутить заголовок с глаз долой, а затем вернуться, чтобы он обновился. Я гуглил, чтобы увидеть, могу ли я найти решение, видел несколько примеров, которые предлагают включить метку в представление для заголовка, но мне нужно, чтобы разделы были динамическими, поэтому я не могу создавать метки для каждого раздела, я также пытался использовать раздел перезагрузки, но это также не работает должным образом, а перезагрузка табличного представления сильно снижает производительность каждый раз, когда значение изменяется в ячейке табличного представления.

мой текущий код для моего titlerForHeaderInSection

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];

int averageScoreTotal, _total;
averageScoreTotal = 0;
_total = 0;

for (BlkCon_BlockToConstructionType *sPC in sectionInfo.objects)
{
    _total = [sPC.compositionPc integerValue];

    averageScoreTotal += _total;
}   

return [NSString stringWithFormat: @"(Total Composition for Group %d)", averageScoreTotal];

}

Заранее благодарю за любую помощь


person Edelmundo    schedule 17.08.2012    source источник
comment
В чем была проблема с reloadSections:withRowAnimation?   -  person Jörn Eyrich    schedule 17.08.2012
comment
Моя проблема в том, что в mytableviewcell у меня есть UISlider, и я хочу, чтобы при изменении значения ползунка сумма в заголовке изменялась соответственно, чтобы отразить изменение значения ползунка. Однако, поскольку я вызываю свое событие configurecell, когда значение ячейки изменяется, разделы перезагрузки вызываются несколько раз, когда значение ползунка изменяется, поэтому представление таблицы сойдет с ума, есть идеи?   -  person Edelmundo    schedule 21.08.2012
comment
О, я вижу. Если вам не нужно обновлять заголовок во время прокрутки, а требуется только после перемещения ползунка на новое значение, вы можете сделать ползунок неактивным. непрерывный (mySlider.continuous=NO;). В противном случае вам следует использовать решение Фабиана.   -  person Jörn Eyrich    schedule 21.08.2012
comment
Я испытываю именно это в ios8 - у меня есть раздел заголовка, и он просто не обновляется, пока я не прокручу все это из поля зрения. В чем была проблема для вас и как вы ее исправили?   -  person NullHypothesis    schedule 25.08.2014


Ответы (1)


Вы можете использовать метод -reloadSections:... UITableView с правильным разделом. Это также перезагрузит заголовок раздела.

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

1) Реализовать -tableView:heightForHeaderInSection: и -tableView:viewForHeaderInSection:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return tableView.sectionHeaderHeight;
}

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    CGFloat height = [self tableView:tableView heightForHeaderInSection:section];
    NSString *title = [self tableView:tableView titleForHeaderInSection:section];

    UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, height)];
    containerView.backgroundColor = tableView.backgroundColor;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(19, 7, containerView.bounds.size.width - 38, 21)];
    label.backgroundColor = [UIColor clearColor];

    label.font = [UIFont boldSystemFontOfSize:17];
    label.shadowOffset = CGSizeMake(0, 1);
    label.shadowColor = [UIColor whiteColor];

    label.text = title;
    label.textColor = [UIColor colorWithRed:0.265 green:0.294 blue:0.367 alpha:1];

    [containerView addSubview:label];

    return containerView;
}

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

3) Если вы хотите сделать заголовок гибким по высоте, установите для свойства numberOfLines метки значение 0, чтобы оно имело неопределенные строки, и убедитесь, что -tableView:heightForHeaderInSection: возвращает правильную высоту.

Чтобы обновить высоту заголовка раздела, используйте

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

Удачи,
Фабиан

Изменить.
Приведенный выше код предполагает, что вы используете ARC.

person Fabian Kreiser    schedule 17.08.2012
comment
Привет, Фабиан, из твоего примера я предполагаю, что мне придется создать отдельную метку для каждого заголовка раздела? В настоящее время у меня около 50 разделов в моих данных, и они будут постоянно меняться по мере добавления новых данных в мое приложение. Не могли бы вы рассказать об использовании массива для хранения меток, чтобы я мог затем получить к ним доступ по отдельности? - person Edelmundo; 21.08.2012
comment
UITableView позаботится об освобождении меток, когда они больше не нужны, не беспокойтесь о проблемах с производительностью. Будущая версия iOS может даже поддерживать повторно используемые виды нижнего колонтитула заголовка таблицы. Если вам нужно получить доступ к меткам, вам придется сохранить их в массиве, потому что в UITableView нет метода для возврата представлений, используемых для заголовков. Вы должны обязательно как-то использовать слабые ссылки на метки, потому что иначе метки не будут выпущены. См. этот вопрос: stackoverflow.com/questions/9336288/ - person Fabian Kreiser; 22.08.2012