with uitableviewcontroller custom ios uitableview uitableviewsectionheader

ios - uitableviewcontroller - UITableView: viewForHeaderInSection: no llamado durante reloadData:



uitableview with header swift (11)

Configuré la vista de tabla con los enlaces correctos de delegado y origen de datos. El método reloadData llama al origen de datos y a los métodos de delegado, excepto para viewForHeaderInSection:

¿Por qué es así?


@rmaddy ha tergiversado la regla, dos veces: en realidad, tableView:viewForHeaderInSection: no requiere que también implemente tableView:heightForHeaderInSection: y también está perfectamente bien llamar tanto a viewForHeader como a viewForHeader . Declararé la regla correctamente solo para el registro:

La regla es simplemente que no se viewForHeader a menos que de alguna manera le dé un alto al encabezado. Puede hacer esto en cualquier combinación de tres maneras:

  • Implementar tableView:heightForHeaderInSection:

  • Establezca la sectionHeaderHeight la tabla sectionHeaderHeight .

  • Llame a titleForHeader (esto de alguna manera da al encabezado un alto predeterminado si no tiene uno).

Si no hace nada de eso, no tendrá encabezados y no se viewForHeader a viewForHeader . Eso es porque sin una altura, el tiempo de ejecución no sabrá cómo cambiar el tamaño de la vista, por lo que no se molesta en pedir una.


Acabo de tener un problema con los encabezados que no se muestran para iOS 7.1 , pero funcionan bien con versiones posteriores que he probado, explícitamente con 8.1 y 8.4.

Para el mismo código exacto, 7.1 no llamaba a ninguno de los métodos de delegación de encabezado de sección, incluidos: tableView:heightForHeaderInSection: y tableView:viewForHeaderInSection:

Después de la experimentación, descubrí que eliminar esta línea de mi viewDidLoad hacía que los encabezados volvieran a aparecer para 7.1 y no afectara a otras versiones que probé:

// _Removing_ this line _fixed_ headers on 7.1 self.tableView.estimatedSectionHeaderHeight = 80;

... entonces, parece haber algún tipo de conflicto allí para 7.1, al menos.


Al dar los valores de sectionHeaderHeight y sectionHeaderHeight se solucionó mi problema. eg, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension


Corté y pegué los siguientes dos métodos de un proyecto Swift 2 en mi proyecto Swift 3, que nunca se llamaron porque en Swift 3 estos métodos deben tener "-" antes del nombre del primer parámetro.

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 }


Debe implementar tableView:heightForHeaderInSection: y establecer la altura para el encabezado> 0.

Este método delegado va junto con el método viewForHeaderInSection: .

Espero que esto ayude.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 40; }


El mismo problema ocurrió conmigo, pero como estaba usando el cálculo de altura automático de xCode 9 , no puedo dar ningún valor de altura explícito como se mencionó anteriormente. Después de un poco de experimentación obtuve una solución , tenemos que anular este método como,

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section { return 44.0f; }

Aunque he verificado ambas opciones

  1. Cálculo automático de altura
  2. Cálculo de altura estimado automático

del guión gráfico como dice la manzana, pero aun así obtuve este extraño error.

Tenga en cuenta que este error se mostró solo en la versión IOS-10 que no está en la versión IOS-11 . Tal vez es un error de xCode. Gracias


El truco es que esos dos métodos pertenecen a diferentes protocolos UITableView:

tableView:titleForHeaderInSection: es un método de protocolo UITableViewDataSource , donde tableView:viewForHeaderInSection pertenece al protocolo UITableViewDelegate (me pregunto por qué, ¿algún comentario?)

Eso significa

  1. Si implementa los métodos, asigne solo usted mismo ya que el dataSource para la UITableView , tableView:viewForHeaderInSection será ignorado y nunca será llamado.

  2. tableView:viewForHeaderInSection tiene una prioridad más alta. Si implementa ambos métodos y se asigna a sí mismo como el origen de dataSource y el delegate para UITableView , devolverá las vistas de los encabezados de las secciones, pero su tableView:titleForHeaderInSection: se ignorará.

  3. Para fines de investigación, he eliminado mi tableView:heightForHeaderInSection: funcionó bien y no pareció afectar los procedimientos anteriores. Pero el documento de comentarios indica que se requiere para que tableView:viewForHeaderInSection funcione correctamente; así que para estar seguro, es aconsejable implementar esto.


El uso de tableView:viewForHeaderInSection: requiere que también implemente tableView:heightForHeaderInSection: Esto debería devolver una altura no diferente de cero para el encabezado. También asegúrese de no implementar también tableView:titleForHeaderInSection: Solo debe usar uno u otro ( viewForHeader o viewForHeader ).


En ocasiones, la configuración de tableview.delegate o datasource = nil en viewWillAppear: o viewDidAppear: métodos pueden causar este problema. Asegúrate de no hacer esto ...


Saliendo de la respuesta de rmaddy, estaba tratando de ocultar la vista de encabezado y devolvía 0.0f para "tableView: heightForHeaderInSection" y una vista de 0 height desde tableView:viewForHeaderInSection .

Después de cambiar desde el return 1.0f para return 0.0f en tableView:heightForHeaderInSection , el método delegado tableView:viewForHeaderInSection fue llamado.

Resulta que mi efecto deseado funciona sin tener que usar "tableView: heightForHeaderInSection"; pero esto puede ser útil para otros que están teniendo problemas para llamar al método delegado "tableView: heightForHeaderInSection".


Vale la pena señalar brevemente que si su implementación de tableView:heightForHeaderInSection: devuelve UITableViewAutomaticDimension , entonces tableView:viewForHeaderInSection: no se tableView:viewForHeaderInSection: .

UITableViewAutomaticDimension supone que se utilizará un UITableViewHeaderFooterView estándar que se rellena con el método delegado tableView:titleForHeaderInSection:

De los comentarios en UITableView.h :

Devolviendo este valor de tableView:heightForHeaderInSection: o tableView:heightForFooterInSection: da como resultado un alto que se ajusta al valor devuelto por tableView:titleForHeaderInSection: o tableView:titleForFooterInSection: si el título no es nil.