Я установил tableview с правильными связями делегата и источника данных .. метод reloadData вызывает источник данных и методы делегата, за исключением viewForHeaderInSection:.
Почему это так?
sectionHeaderHeight?
Я установил tableview с правильными связями делегата и источника данных .. метод reloadData вызывает источник данных и методы делегата, за исключением viewForHeaderInSection:.
Почему это так?
sectionHeaderHeight?
Ответы:
Использование tableView:viewForHeaderInSection:требует, чтобы вы также реализовали tableView:heightForHeaderInSection:. Это должно вернуть соответствующую ненулевую высоту заголовка. Также убедитесь, что вы также не реализуете tableView:titleForHeaderInSection:. Вы должны использовать только одно или другое ( viewForHeaderили titleForHeader).
numberOfSections.
titleForHeaderInSection:и, viewForHeaderInSection:и представление, возвращаемое из последнего, является подклассом, UITableViewHeaderFooterViewтогда textLabel.textоно автоматически устанавливается на версию titleForHeaderInSection:строки с заглавными буквами. Чтобы предотвратить такое поведение, либо не реализуйте, titleForHeaderInSection:либо используйте настраиваемую метку вместо унаследованной textLabel.
Хитрость в том, что эти два метода принадлежат разным UITableViewпротоколам: tableView:titleForHeaderInSection:это UITableViewDataSourceметод протокола, которому tableView:viewForHeaderInSectionпринадлежит UITableViewDelegate.
Это значит:
Если вы реализуете методы, но назначаете себя только как
dataSourceдля UITableView, ваша
tableView:viewForHeaderInSectionреализация будет проигнорирована.
tableView:viewForHeaderInSectionимеет более высокий приоритет. Если вы реализуете оба метода и назначите себя как the, так
dataSourceи как delegateдля UITableView, вы вернете представления для заголовков разделов, но ваши
tableView:titleForHeaderInSection:будут проигнорированы.
Я тоже пробовал удалить tableView:heightForHeaderInSection:; он работал нормально и, похоже, не повлиял на описанные выше процедуры. Но в документации написано, что это необходимо для tableView:viewForHeaderInSectionкорректной работы; так что на всякий случай разумно реализовать и это.
UITableViewDelegateна self, потому что я думал, что tableView:viewForHeaderInSectionэто UITableViewDataSourceметод. Спасибо!
titleForHeaderимеющего внутренний размер. Внутренний размер рассчитывается на основе семейства шрифтов и размера.
@rmaddy имеет искажен правило, в два раза: на самом деле, tableView:viewForHeaderInSection:вовсе не требует , чтобы вы также осуществить tableView:heightForHeaderInSection:, а также он прекрасно подходит для вызова как titleForHeaderи viewForHeader. Правильно сформулирую правило для записи:
Правило состоит в том, что viewForHeaderон не будет вызываться, если вы каким-то образом не укажете высоту заголовка. Вы можете сделать это в любой комбинации из трех способов:
Реализовать tableView:heightForHeaderInSection:.
Накрыть на стол sectionHeaderHeight.
Вызов titleForHeader(это каким-то образом дает заголовку высоту по умолчанию, если в противном случае у него ее нет).
Если вы не сделаете ничего из этого, у вас не будет заголовков, и viewForHeaderвы не будете вызваны. Это потому, что без высоты среда выполнения не узнает, как изменить размер представления, поэтому она не беспокоит его.
tableView:viewForHeaderInSection:: «Этот метод работает правильно, только если tableView:heightForHeaderInSection:он также реализован».
titleForHeaderInSectionи viewForHeaderInSection? Табличное представление вызовет только один из двух (я забыл, какой в данный момент имеет приоритет).
viewForHeader вызывается без какого-либо из этих трех способов присвоения высоты. У меня было такое, когда мне viewForHeaderзвонили, и заголовки появлялись нормально, пока однажды, без каких-либо изменений с моей стороны, этого не произошло . Именно тогда я начал экспериментировать, viewForHeaderчтобы определить минимальные требования для вызова. И теперь я знаю. И теперь вы тоже.
Предоставление estimatedSectionHeaderHeightи sectionHeaderHeightценности устранили мою проблему. например,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
Отказавшись от ответа rmaddy, я пытался скрыть представление заголовка и возвращал 0,0f для «tableView: heightForHeaderInSection» и вид с нулевой высотой tableView:viewForHeaderInSection.
После перехода с return 1.0fна return 0.0fin действительно был вызван tableView:heightForHeaderInSectionметод делегата tableView:viewForHeaderInSection.
Оказывается, желаемый эффект работает без использования tableView: heightForHeaderInSection; но это может быть полезно для других, у которых возникла проблема с вызовом метода делегата tableView: heightForHeaderInSection.
Вы должны реализовать tableView:heightForHeaderInSection:и установить высоту заголовка> 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:если заголовок не равен нулю.
estimatedSectionHeaderHeightкакое-то значение, tableView:viewForHeaderInSectionбудет вызываться (аналогично тому, как работают автоматические измерения для строк)
У меня только что возникла проблема с заголовками, которые не отображаются для 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 - дело не в том, что они не вызывались при прокрутке tableview и загрузке новых ячеек, но любой выбор шрифта, который я сделал для textLabel headerView, появлялся только на том, что изначально было видно при загрузке , а не во время прокрутки таблицы.
Исправление было willDisplayHeaderView:
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
Работал у меня.
В моем случае
viewForHeaderInSection
был реализован в производном классе очень далеко, что не мешало переходу в суперкласс.
Причина, по которой viewForHeaderInSectionне вызывается, может быть по одной из двух причин:
Либо вы не настроили свой UITableViewDelegate, либо UITableViewDelegateнеправильно настроили .
В моем случае это была причина, по которой я не реализовал:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
Я вырезал и вставил следующие два метода из проекта 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
}
heightForHeaderInSection:реализован?