Я установил 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.0f
in действительно был вызван 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:
реализован?