Я знаю, что этот вопрос был для iOS 5, но для будущих читателей, обратите внимание, что эффективную iOS 6 мы теперь можем использовать dequeueReusableHeaderFooterViewWithIdentifier
вместо dequeueReusableCellWithIdentifier
.
Так viewDidLoad
, вызов либо registerNib:forHeaderFooterViewReuseIdentifier:
или registerClass:forHeaderFooterViewReuseIdentifier:
. Тогда viewForHeaderInSection
позвони tableView:dequeueReusableHeaderFooterViewWithIdentifier:
. Вы не используете прототип ячейки с этим API (это либо представление на основе NIB, либо представление, созданное программным способом), но это новый API для устаревших верхних и нижних колонтитулов.
Просто используйте ячейку прототипа в качестве заголовка раздела и / или нижнего колонтитула.
tableView:viewForHeaderInSection:
метод илиtableView:viewForFooterInSection:
метод[tableView dequeueReusableCellWithIdentifier:]
чтобы получить заголовокtableView:heightForHeaderInSection:
метод.Редактировать: Как изменить заголовок заголовка (прокомментированный вопрос):
tableView:viewForHeaderInSection:
методе получите метку по телефону:источник
viewForHeaderInSection
методе (не нужно добавлять какие-либо пользовательские UIViews).dequeueReusableHeaderFooterViewWithIdentifier
представлен, и теперь предпочтительнее, чем этот ответ. Но для правильного использования теперь требуется больше шагов. У меня есть руководство @ samwize.com/2015/11/06/... .UITableViewCell
в качестве заголовка. Вам будет очень трудно отлаживать визуальные глюки - заголовок иногда исчезает из-за того, как ячейки удаляются, и вы будете часами искать почему, пока не поймете, чтоUITableViewCell
он не принадлежитUITableView
заголовку.В iOS 6.0 и выше все изменилось с новым
dequeueReusableHeaderFooterViewWithIdentifier
API.Я написал руководство (протестировано на iOS 9), которое можно резюмировать так:
UITableViewHeaderFooterView
viewDidLoad
viewForHeaderInSection
и используйте,dequeueReusableHeaderFooterViewWithIdentifier
чтобы вернуть верхний / нижний колонтитулисточник
Я получил его в iOS7, используя прототип ячейки в раскадровке. У меня в пользовательском представлении заголовка раздела есть кнопка, которая запускает переход, настроенный в раскадровке.
Начните с решения Tieme
Как указывает pedro.m, проблема в том, что при нажатии заголовка раздела выбирается первая ячейка в разделе.
Как указывает Пол Фон, это исправляется возвращением contentView ячейки вместо всей ячейки.
Однако, как отмечает Хонс, долгое нажатие на заголовок раздела приведет к сбою приложения.
Решение состоит в том, чтобы удалить любые жесты-распознаватели из contentView.
Если вы не используете жесты в представлениях заголовков разделов, этот небольшой хак, похоже, сделает это.
источник
Если вы используете раскадровки, вы можете использовать ячейку прототипа в табличном представлении для компоновки представления заголовка. Установите уникальный идентификатор и viewForHeaderInSection, вы можете удалить ячейку с этим идентификатором и привести ее к UIView.
источник
Если вам нужна быстрая реализация этого, следуйте инструкциям на принятом ответе, а затем в вашем UITableViewController реализуйте следующие методы:
источник
Решение, которое я придумал, в основном такое же решение, которое использовалось до появления раскадровок.
Создайте новый, пустой файл класса интерфейса. Перетащите UIView на холст, разметьте по желанию.
Загрузите перо вручную, назначьте соответствующий раздел верхнего / нижнего колонтитула в методах делегирования viewForHeaderInSection или viewForFooterInSection.
Я надеялся, что Apple упростит этот сценарий с помощью раскадровок и продолжит искать лучшее или более простое решение. Например, пользовательские заголовки таблиц и нижние колонтитулы просто добавить.
источник
tableView:titleForHeaderInSection
, это однострочник.Когда вы возвращаете contentView ячейки, у вас будет 2 проблемы:
viewForHeaderInSection
вызове вы создаете новую ячейку)Решение:
Класс Wrapper для верхнего / нижнего колонтитула таблицы. Это просто контейнер, унаследованный от
UITableViewHeaderFooterView
, который содержит ячейку внутриhttps://github.com/Magnat12/MGTableViewHeaderWrapperView.git
Зарегистрируйте класс в вашем UITableView (например, в viewDidLoad)
В вашем UITableViewDelegate:
источник
Раньше я делал лениво для создания представлений верхнего / нижнего колонтитула:
[NSNull null]
источник
У меня были проблемы в сценарии, когда заголовок никогда не использовался, даже когда я делал все необходимые шаги.
Так что в качестве подсказки всем, кто хочет достичь ситуации с показом пустых секций (0 строк), следует предупредить, что:
dequeueReusableHeaderFooterViewWithIdentifier не будет повторно использовать заголовок, пока вы не вернете хотя бы одну строку
Надеюсь, поможет
источник
Чтобы прокомментировать предложение Дэймона , вот как я сделал заголовок выбираемым, как обычная строка с индикатором раскрытия.
Я добавил Button подклассы из UIButton (имя подкласса "ButtonWithArgument") в ячейку прототипа заголовка и удалил текст заголовка (жирный текст "Title" - это еще одна UILabel в ячейке прототипа)
затем установите кнопку на весь заголовок и добавьте индикатор раскрытия с помощью хитрости Avario
ButtonWithArgument.h
ButtonWithArgument.m
источник
Вы должны использовать решение Tieme в качестве основы, но забудьте о
viewWithTag:
других и подозрительных подходах, вместо этого попробуйте перезагрузить ваш заголовок (перезагрузив этот раздел).Поэтому после того, как вы добавили в свой пользовательский вид заголовка ячейки все причудливые
AutoLayout
вещи, просто удалите его из очереди и верните contentView после настройки, например:источник
Как насчет решения, в котором заголовок основан на массиве представления:
Далее в делегате:
источник
Добавить ячейку
StoryBoard
и установитьreuseidentified
Код
и
Использование:
источник
Аналогично ответу laszlo, но вы можете повторно использовать одну и ту же ячейку прототипа как для ячейки таблицы, так и для ячейки заголовка раздела. Добавьте первые две функции ниже в ваш подкласс UIViewController
источник
Вот ответ @Vitaliy Gozhenko , в Swift.
Подводя итог, вы создадите UITableViewHeaderFooterView, который содержит UITableViewCell. Этот UITableViewCell будет «извлекаемым», и вы можете создать его в своей раскадровке.
Создайте класс UITableViewHeaderFooterView
Подключите табличное представление к этому классу в функции viewDidLoad:
При запросе заголовка раздела удалите из очереди CustomHeaderFooterView и вставьте в него ячейку.
источник