Я установил tableview с правильными связями делегирования и datasource.. метод reloadData вызывает метод data и delegate, за исключением viewForHeaderInSection:
.
Почему это так?
Я установил tableview с правильными связями делегирования и datasource.. метод reloadData вызывает метод data и delegate, за исключением viewForHeaderInSection:
.
Почему это так?
Использование tableView:viewForHeaderInSection:
требует, чтобы вы также реализовали tableView:heightForHeaderInSection:
. Это должно возвращать соответствующую ненулевую высоту для заголовка. Также убедитесь, что вы также не реализуете tableView:titleForHeaderInSection:
. Вы должны использовать только один или другой (viewForHeader
или titleForHeader
).
Хитрость в том, что эти два метода принадлежат разным протоколам UITableView
: tableView:titleForHeaderInSection:
- это метод протокола UITableViewDataSource
, где tableView:viewForHeaderInSection
принадлежит UITableViewDelegate
.
Это значит:
Если вы реализуете методы, но назначаете себя только как
dataSource
для UITableView
, ваш
Реализация tableView:viewForHeaderInSection
будет игнорироваться.
tableView:viewForHeaderInSection
имеет более высокий приоритет. если ты
реализовать оба метода и назначить себя как
dataSource
и delegate
для UITableView
, вы будете
вернуть представления для заголовков разделов, но ваш
tableView:titleForHeaderInSection:
будет игнорироваться.
Я также попытался удалить tableView:heightForHeaderInSection:
; это работало нормально и, похоже, не влияло на вышеуказанные процедуры. Но в документации сказано, что для правильной работы tableView:viewForHeaderInSection
требуется; поэтому, чтобы быть в безопасности, разумно это реализовать.
@rmaddy неправильно это правило дважды: на самом деле tableView:viewForHeaderInSection:
не требует, чтобы вы также реализовали tableView:heightForHeaderInSection:
, а также отлично назвать оба titleForHeader
и viewForHeader
. Я правильно сформулирую правило для записи:
Правило просто в том, что viewForHeader
не будет вызываться, если вы каким-то образом не дадите заголовку высоту. Вы можете сделать это в любой комбинации из трех способов:
Внедрить tableView:heightForHeaderInSection:
.
Задайте таблицу sectionHeaderHeight
.
Вызов titleForHeader
(это как-то дает заголовку высоту по умолчанию, если в противном случае она не имеет).
Если вы ничего не делаете, у вас не будет заголовков, а viewForHeader
не будет вызываться. Это потому, что без высоты, среда выполнения не будет знать, как изменить размер представления, поэтому не стоит просить об этом.
Предоставление значений estimatedSectionHeaderHeight
и sectionHeaderHeight
исправило мою проблему.
например.,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
Отправляя ответ rmaddy, я пытался скрыть представление заголовка и возвращал 0.0f для "tableView: heightForHeaderInSection" и 0 height View из tableView:viewForHeaderInSection
.
После перехода от return 1.0f
в return 0.0f
в tableView:heightForHeaderInSection
метод делегирования tableView:viewForHeaderInSection
действительно был вызван.
Оказывается, мой желаемый эффект работает без использования "tableView: heightForHeaderInSection"; но это может быть полезно для других, у которых возникла проблема с вызовом метода делегата tableView: heightForHeaderInSection.
Вы должны реализовать tableView:heightForHeaderInSection:
и установить высоту для заголовкa > 0.
Этот метод делегата совпадает с методом viewForHeaderInSection:
.
Надеюсь, это поможет.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
Стоит вкратце отметить, что если ваша реализация tableView:heightForHeaderInSection:
возвращает UITableViewAutomaticDimension
, то tableView:viewForHeaderInSection:
не будет вызываться.
UITableViewAutomaticDimension
предполагает, что будет использоваться стандартный UITableViewHeaderFooterView
, который заполняется с помощью метода делегата tableView:titleForHeaderInSection:
.
Из комментариев в UITableView.h
:
Возврат этого значения из
tableView:heightForHeaderInSection:
илиtableView:heightForFooterInSection:
приводит к высоте, которая соответствует значению, возвращаемому изtableView:titleForHeaderInSection:
илиtableView:titleForFooterInSection:
, если заголовок не равен нулю.
У меня только что возникла проблема с заголовками, которые не показываются для iOS 7.1, но отлично работают с более поздними версиями, которые я тестировал, явно с 8.1 и 8.4.
Для того же самого кода 7.1 не вызывал ни одного из методов делегирования заголовка раздела вообще, включая: tableView:heightForHeaderInSection:
и tableView:viewForHeaderInSection:
.
После экспериментов я обнаружил, что удаление этой строки из моих заголовков viewDidLoad
снова появляется для 7.1 и не влияет на другие проверенные мной версии:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
... так что, похоже, какой-то конфликт существует для 7.1, по крайней мере.
Такая же проблема возникла у меня, но поскольку я использовал автоматический расчет высоты от xCode 9, я не могу дать никакого явного значения высоты, как указано выше. После некоторого эксперимента я получило решение, мы должны переопределить этот метод как,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
Хотя у меня отмечен обе опции
из раскадровки, как говорит яблоко, но все же я получил эту странную ошибку.
Обратите внимание. Эта ошибка была показана только в версии IOS-10 не в версии IOS-11. Возможно, это ошибка от xCode. Благодаря
Вот что я нашел (Swift 4) (благодаря этому комментарию на другой вопрос)
Независимо от того, использовал ли я titleForHeaderInSection или viewForHeaderInSection - они не вызывались при прокрутке таблицы и при загрузке новых ячеек, но любые варианты шрифтов, которые я сделал для headerView textLabel, появлялись только в том, что первоначально было видно при загрузке., а не как стол прокручивался.
Исправление было: DisplayDheplayView:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel?.font = UIFont(name: yourFont, size: 42)
}
}
В моем случае я создал вид заголовка, используя UITableviewCell
и возвращая ячейку в viewForHeaderInSection
следующим образом
return cell
изменил это на
return cell.contentView
работал на меня.
Иногда установка tableview.delegate
или datasource = nil
в методах viewWillAppear:
или viewDidAppear:
может вызвать эту проблему. Не забудьте сделать это...
Я вырезал и вставлял следующие два метода из проекта Swift 2 в мой проект Swift 3, которые никогда не вызывались, потому что в Swift 3 эти методы должны иметь "-" перед первым именем параметра.
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 44.0
}
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView
return headerView
}