Я установил tableview с правильными связями делегата и источника данных .. метод reloadData вызывает источник данных и методы делегата, за исключением viewForHeaderInSection:
.
Почему это так?
ios
uitableview
uitableviewsectionheader
inforeqd
источник
источник
heightForHeaderInSection:
реализован?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:
метод.Надеюсь, это поможет.
источник
Стоит вкратце отметить, что если ваша реализация
tableView:heightForHeaderInSection:
вернетUITableViewAutomaticDimension
, тоtableView:viewForHeaderInSection:
называться не будет.UITableViewAutomaticDimension
предполагает, чтоUITableViewHeaderFooterView
будет использоваться стандарт , который заполняется методом делегатаtableView:titleForHeaderInSection:
.Из комментариев в
UITableView.h
:источник
estimatedSectionHeaderHeight
какое-то значение,tableView:viewForHeaderInSection
будет вызываться (аналогично тому, как работают автоматические измерения для строк)У меня только что возникла проблема с заголовками, которые не отображаются для iOS 7.1 , но отлично работают с более поздними версиями, которые я тестировал, явно с 8.1 и 8.4.
Для того же самого кода 7.1 вообще не вызывал никаких методов делегата заголовка раздела, включая:
tableView:heightForHeaderInSection:
иtableView:viewForHeaderInSection:
.После экспериментов я обнаружил, что удаление этой строки из моих
viewDidLoad
созданных заголовков снова появляется в 7.1 и не влияет на другие версии, которые я тестировал:… Так что вроде бы там хоть какой-то конфликт для 7.1.
источник
У меня возникла такая же проблема, но поскольку я использовал автоматический расчет высоты из xCode 9 , я не могу указать явное значение высоты, как упомянуто выше. После некоторых экспериментов я получил решение , мы должны переопределить этот метод как,
Хотя я проверил оба варианта
из раскадровки, как говорит яблоко, но все же я получил эту странную ошибку.
Обратите внимание : эта ошибка отображалась только в версии IOS-10, но не в версии IOS-11 . Может это ошибка xCode. Спасибо
источник
Вот что я нашел ( Swift 4 ) (благодаря этому комментарию по другому вопросу)
Независимо от того, использовал ли я titleForHeaderInSection или viewForHeaderInSection - дело не в том, что они не вызывались при прокрутке tableview и загрузке новых ячеек, но любой выбор шрифта, который я сделал для textLabel headerView, появлялся только на том, что изначально было видно при загрузке , а не во время прокрутки таблицы.
Исправление было willDisplayHeaderView:
источник
В моем случае я создал представление заголовка, используя
UITableviewCell
и возвращая ячейку,viewForHeaderInSection
как этоизменил это на
Работал у меня.
источник
В моем случае
был реализован в производном классе очень далеко, что не мешало переходу в суперкласс.
источник
Причина, по которой
viewForHeaderInSection
не вызывается, может быть по одной из двух причин:Либо вы не настроили свой
UITableViewDelegate
, либоUITableViewDelegate
неправильно настроили .источник
В моем случае это была причина, по которой я не реализовал:
источник
Иногда эту проблему может вызвать установка
tableview.delegate
илиdatasource = nil
в методахviewWillAppear:
илиviewDidAppear:
. Постарайтесь этого не делать ...источник
Я вырезал и вставил следующие два метода из проекта Swift 2 в свой проект Swift 3, которые никогда не вызывались, потому что в Swift 3 эти методы должны иметь «-» перед именем первого параметра.
источник