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 tablasectionHeaderHeight
.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
- Cálculo automático de altura
- 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
Si implementa los métodos, asigne solo usted mismo ya que el
dataSource
para laUITableView
,tableView:viewForHeaderInSection
será ignorado y nunca será llamado.tableView:viewForHeaderInSection
tiene una prioridad más alta. Si implementa ambos métodos y se asigna a sí mismo como el origen dedataSource
y eldelegate
paraUITableView
, devolverá las vistas de los encabezados de las secciones, pero sutableView:titleForHeaderInSection:
se ignorará.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 quetableView: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:
otableView:heightForFooterInSection:
da como resultado un alto que se ajusta al valor devuelto portableView:titleForHeaderInSection:
otableView:titleForFooterInSection:
si el título no es nil.