Заголовки разделов tableView исчезают SWIFT

У меня есть tableView, настроенный так, что при прикосновении к ячейке она расширяется по высоте, чтобы показать больше информации. TableView имеет 5 разделов.

У меня есть ошибка: когда ячейка расширяется, все ячейки заголовков ниже этой ячейки становятся невидимыми. Консоль выводит следующее: «[31233:564745] нет индексного пути для повторно используемой ячейки таблицы»

В моей раскадровке у меня есть 2 настраиваемые ячейки: "myCell" для ячеек, несущих данные, и "headerCell" для заголовков.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

   let thisGoal : GoalModel = goalArray[indexPath.section][indexPath.row]


    if self.currentPath != nil && self.currentPath == indexPath  {
        self.currentPath = nil
    } else {
        self.currentPath = indexPath
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}

Если я ввожу tableView.reloadData() между начальными/конечными обновлениями, он работает правильно, хотя фон заголовка становится черным и теряется анимация.

У меня есть все материалы для заголовков, объявленные в: func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

что мне не хватает? Мне бы очень хотелось, чтобы tableView все еще имел анимацию и сохранял фон clearColor().

Заранее спасибо. Я прочитал объективные ответы C, но не смог заставить их работать на меня. Я был бы очень признателен за помощь SWIFT.

Я думаю, что проблема заключается в том, что путь без индекса для повторно используемой ячейки таблицы.


person Mason Ballowe    schedule 10.05.2015    source источник


Ответы (6)


Я нашел ответ в выводе консоли. Используйте этот код в функции заголовка:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 

Не возвращайте свой headerCell или повторно используемый идентификатор. Верните reuseIdentifier.contentView. Для меня это: return headerCell!.contentView.

person Mason Ballowe    schedule 10.05.2015
comment
В таком случае я получаю прозрачный вид заголовка. - person Artem Mostyaev; 23.11.2015
comment
Что делать, если вы хотите добавить кнопки или жесты в ячейку? Это не сработает, потому что contentView ничего об этом не узнает. - person eMdOS; 01.11.2016
comment
да, это не работает, если у меня есть кнопка... вы нашли решение для этой eMdOS? - person user2749248; 15.01.2017
comment
Все мои представления становятся невидимыми, когда я возвращаю header.contentView - person Lohith Korupolu; 30.06.2017
comment
Добавьте жест касания на contentView, а не на ячейку/просмотр, тогда он будет работать. - person Shrikant K; 31.07.2017
comment
Спасибо за решение моей проблемы, но может ли кто-нибудь объяснить, почему это происходит? - person Sagar Daundkar; 24.04.2018
comment
Альтернативой является создание собственной метки в подклассе пользовательской ячейки, и таким образом вы можете вернуть представление вместо представления содержимого. - person user1046037; 17.05.2018
comment
Хахаха. Это сработало. Не могу поверить, но это сработало. К черту яблоко. - person Rishab; 04.03.2019
comment
Возвращение просмотра содержимого удалило мое форматирование ячейки, т.е. угловой радиус. Любое решение? - person Mitesh Dobareeya; 02.05.2019
comment
Я буду использовать собственный UIView внутри ячейки и помещать в него все элементы управления/другие представления вместо ячейки. И используйте этот пользовательский UIView в качестве заголовка. - person dev_exo; 16.08.2019

Просто чтобы добавить, я был сбит с толку НАМНОГО дольше, чем должен был, почему я не мог ссылаться на contentView моей ячейки, когда я мог совершенно ясно видеть, что он был там. Мой пользовательский класс (использующий UITableViewCell, а не UITableViewHeaderFooterView) каждый раз будет возвращать фатальную ошибку. Поэтому убедитесь, что любой пользовательский стиль настроен в классе UITableViewHeaderFooterView, например:

class CustomHeaderCell: UITableViewHeaderFooterView {

Вам также нужно будет зарегистрировать resuableIdentifer следующим образом:

tableView.registerNib(UINib(nibName: "HeaderCell", bundle: nil), forHeaderFooterViewReuseIdentifier: "CellHeader")

Тогда этот плохой мальчик:

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("CellHeader") as! CustomHeaderCell!
    return headerCell!.contentView
}
person David West    schedule 23.03.2016
comment
нет необходимости добавлять UITableViewHeaderFooterView, если класс расширен в UITableViewController. спасибо за ответ headerCell!.contentView - person Led; 11.08.2016
comment
Не обязательно использовать UITableViewHeaderFooterView, я использую класс UITableViewCell, но ключ должен был вернуть cell.contentView, а не саму ячейку. Возврат всей ячейки вызывал у меня проблему. - person Satheesh; 16.10.2017
comment
добавление .contentView спасло мой день - person Grease; 15.11.2017
comment
Это лучший ответ! Никогда не делайте заголовки похожими на клетки! - person WorieN; 31.05.2018

Поскольку у меня еще нет репутации 50, я не могу комментировать предыдущий ответ, поэтому приношу извинения за то, что указал это как еще один ответ.

Возврат ContentView заставит функцию работать, но удалит все форматирование, выполненное для reuseIdentifier (headerCell)

headerCell.backgroundColor = UIColor.cyanColor()

Это НЕ обеспечит голубой цвет для вашего headerCell

Чтобы исправить это, просто добавьте «.contentView» в строки форматирования.

headerCell.contentView.backgroundColor = UIColor.cyanColor()
person Nathan Wharry    schedule 07.02.2016

Заголовки представления таблицы в 2 таблицах исчезли, когда я преобразовал свое приложение в IOS 10 — я нашел причину в документации API разработчика Apple в заголовках таблиц. Когда я добавил следующее, отсутствующие заголовки снова появились!

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return 44 // where 44 is the header cell view height in my storyboard
}
person Frans    schedule 12.10.2016
comment
Кажется, это имеет место только в iOS 10, а не в 11/12. - person Christopher Pickslay; 31.10.2018

Вы можете обернуть TableViewCell внутри UIView

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  let containerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 50)) // 50 = Header height

  guard let headerCell = tableView.dequeueReusableCell(withIdentifier: "MyHeaderView") as? MyHeaderView else { fatalError(" Failed to load MyHeaderView") }
  headerCell.frame = containerView.bounds
  containerView.addSubview(headerCell)

  return containerView
}
person dev    schedule 25.09.2018

У меня была такая же ошибка, потому что я возвращал ячейку, используя метод удаления из очереди вместо UITableViewHeaderFooterView.

Решение:

  • Добавить представление вне иерархии представлений
  • Установите тип UITableViewHeaderFooterView
  • Настроить
  • Ссылка на @IBOutlet
  • В func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? вернуть розетку

Распространенные ловушки:

Не забудьте установить размеры заголовка. Не забудьте установить выход как сильный.

person Antzi    schedule 29.03.2018