Изменение заголовка раздела 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
Одним из решений было бы управлять внешним массивом для заголовков нескольких разделов, содержащих ссылки на ярлыки, и обновлять их извне.