Изменение заголовка раздела UITableView без tableView: titleForHeaderInSection

Я пытаюсь изменить заголовок заголовка для раздела в UITableView, когда выбрана ячейка из этого раздела. tableView:titleForHeaderInSection запускается приложением, поэтому это не помогает. Я могу вызвать reloadData, но производительность страдает, потому что приложение должно перезагрузить все видимые ячейки. Я также попытался использовать настраиваемый заголовок, но это также приводит к некоторым проблемам с производительностью.

Есть ли способ получить дескриптор UILabel, который использует вид заголовка по умолчанию, и изменить его текст вручную?

Спасибо!

Ответы

Ответ 1

Кажется, что нет никакого стандартного API для доступа к представлению заголовка раздела в системе. Вы пробовали более целенаправленный reloadSections:withRowAnimation, чтобы заставить UIKit отображать новый текст заголовка?

Какие проблемы с производительностью вы видели с пользовательскими заголовками заголовков разделов? Я сомневаюсь, что стандартное значение намного больше, чем просто UILabel.

Ответ 2

Вызов [tableView endUpdates] может обеспечить желаемые результаты без чрезмерного количества ударов по производительности.

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

// forces the tableView to ask its delegate/datasource the following:
//   numberOfSectionsInTableView:
//   tableView:titleForHeaderInSection:
//   tableView:titleForFooterInSection:
//   tableView:viewForHeaderInSection:
//   tableView:viewForFooterInSection:
//   tableView:heightForHeaderInSection:
//   tableView:heightForFooterInSection:
//   tableView:numberOfRowsInSection:

Ответ 3

с:

[self.tableView headerViewForSection:i]

вы можете получить представление для раздела i, а затем вручную "обновить"

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

[self.tableView headerViewForSection:i].textLabel.text = [self tableView:self.tableView titleForHeaderInSection:i];

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

[label.text sizeWithFont:label.font];

Ответ 4

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

UITableViewHeaderFooterView *sectionZeroHeader = [self.tableView headerViewForSection:0];
NSString *sectionZeroLabel = @"Section Zero";
[sectionZeroHeader.textLabel setText:[sectionZeroLabel uppercaseString]];
[sectionZeroHeader setNeedsLayout];

Убедитесь, что в заголовке заголовка раздела он нуждается в макете, иначе новый текст может быть усечен. Кроме того, метки разделов обычно имеют верхний регистр.

Ответ 5

Так как UITableView не вставляет в очередь и деактивирует заголовки разделов для повторного использования, вы можете также увидеть, возможно ли хранить все заголовки заголовков раздела в памяти. Обратите внимание, что вам нужно будет создавать свои собственные заголовки заголовков раздела с фоном и т.д., Но это позволяет вам немного больше гибкости и возможностей.

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

Ответ 6

Это WAG, и я могу думать о множестве причин, почему это может не сработать, но не могли бы вы перебирать через subviews и найти тот, который вы ищете? Например.

for (UIView *v in self.tableView.subviews) {
    // ... is this the one?
}

Ответ 7

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