2009-10-19 5 views
14

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

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

Спасибо!

ответ

14

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

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

+0

Кажется, мне, возможно, придется использовать reloadSections, хотя это почти так же медленно, как перезагрузка всей таблицы (по крайней мере, для моего приложения). Я был сорван на каждом шагу API Cocoa. Я попытался использовать круговую очередь для повторного использования набора UILabel и возвращения их в viewForHeader, но viewForHeader вызывается для так много ячеек (даже те, которые не видны!), Что мне нужно создать отдельный UILabel для каждой ячейки, который просто плох. Argh! – 2009-10-24 00:46:52

0

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

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

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

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

24

Вызов [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: 
+1

В iOS10/11 (swift) Я заметил, что 'tableView: viewForHeaderInSection:' и 'tableView: viewForFooterInSection:' не вызывается, поэтому вам нужно самому изменить представление –

13

с:

[self.tableView headerViewForSection:i] 

вы могли бы получить вид на Раздел I, а затем «обновление» это вручную

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

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

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

[label.text sizeWithFont:label.font]; 
+0

Hackish и не рекомендуется делать, но это делает именно то, что требовалось в исходном вопросе. Итак, +1. – bioffe

+2

[self.tableView headerViewForSection: i] всегда дает значение nil –

+0

Я бы предположил, что вы получите нуль, если у вас нет заголовка (т.е. статических ячеек, созданных в раскадровке, и без текста «Заголовок» -Поля каждой секции). –

0

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

3

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

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

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

+0

Это не работает, если вы используете автоматическую высоту. – lostintranslation

Смежные вопросы