Я встановив табличний перегляд з правильними зв'язками делегатів та джерел даних .. метод reloadData викликає джерела даних та методи делегування, за винятком viewForHeaderInSection:
.
Чому це так?
sectionHeaderHeight
?
Я встановив табличний перегляд з правильними зв'язками делегатів та джерел даних .. метод 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
має більш високий пріоритет. Якщо ви реалізуєте обидва способи і призначите себе як і як,
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" та 0 View висоти від tableView:viewForHeaderInSection
.
Після зміни з return 1.0f
на return 0.0f
на 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 ) (завдяки цьому коментарю до іншого питання)
Я використовував заголовокForHeaderInSection чи viewForHeaderInSection - це було не те, що вони не викликали, коли проглядав таблицю та пропускали нові комірки, але будь-який вибір шрифту, який я зробив для 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 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:
реалізовано?