He configurado la vista de tabla con los enlaces correctos de delegado y fuente de datos. El método reloadData llama a la fuente de datos y los métodos delegado a excepción de viewForHeaderInSection:
.
¿Por qué es así?
ios
uitableview
uitableviewsectionheader
inforeqd
fuente
fuente
heightForHeaderInSection:
implementado?sectionHeaderHeight
?Respuestas:
El uso de
tableView:viewForHeaderInSection:
requiere que también implementetableView:heightForHeaderInSection:
. Esto debería devolver una altura distinta de cero para el encabezado. También asegúrese de no implementar también eltableView:titleForHeaderInSection:
. Solo debe usar uno u otro (viewForHeader
otitleForHeader
).fuente
numberOfSections
.titleForHeaderInSection:
yviewForHeaderInSection:
la vista devuelta por este último es una subclase de,UITableViewHeaderFooterView
entoncestextLabel.text
se establece automáticamente en la versión en mayúsculas de latitleForHeaderInSection:
cadena. Para evitar este comportamiento, no implementetitleForHeaderInSection:
ni use una etiqueta personalizada en lugar de la heredadatextLabel
.El truco es que esos dos métodos pertenecen a
UITableView
protocolos diferentes :tableView:titleForHeaderInSection:
es unUITableViewDataSource
método de protocolo, al quetableView:viewForHeaderInSection
perteneceUITableViewDelegate
.Eso significa:
Si implementa los métodos pero se asigna solo como
dataSource
paraUITableView
, sutableView:viewForHeaderInSection
implementación será ignorada.tableView:viewForHeaderInSection
Tiene una mayor prioridad. Si implementa ambos métodos y se asigna a sí mismo como eldataSource
ydelegate
para elUITableView
, devolverá las vistas para los encabezados de sección, perotableView:titleForHeaderInSection:
se ignorará.También he intentado eliminar
tableView:heightForHeaderInSection:
; funcionó bien y no pareció afectar los procedimientos anteriores. Pero la documentación dice que es necesario paratableView:viewForHeaderInSection
que funcione correctamente; así que para estar seguros, es aconsejable implementar esto también.fuente
UITableViewDelegate
aself
, porque pensé, quetableView:viewForHeaderInSection
es unUITableViewDataSource
método. ¡Gracias!titleForHeader
que tiene un tamaño intrínseco. El tamaño intrínseco se calcula en función de la familia de fuentes y el tamaño.@rmaddy ha tergiversado la regla, en dos ocasiones: en realidad,
tableView:viewForHeaderInSection:
no no requieren que se implemente tambiéntableView:heightForHeaderInSection:
, y también está perfectamente bien para llamar tantotitleForHeader
yviewForHeader
. Declararé la regla correctamente solo para el registro:La regla es simplemente que
viewForHeader
no se llamará a menos que de alguna manera le des una altura al encabezado. Puede hacer esto en cualquier combinación de tres formas:Poner en práctica
tableView:heightForHeaderInSection:
.Poner la mesa
sectionHeaderHeight
.Llamada
titleForHeader
(esto de alguna manera le da al encabezado una altura predeterminada si de lo contrario no tiene uno).Si no hace ninguna de esas cosas, no tendrá encabezados y
viewForHeader
no se le llamará. 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.fuente
tableView:viewForHeaderInSection:
: "Este método solo funciona correctamente cuandotableView:heightForHeaderInSection:
también se implementa".titleForHeaderInSection
yviewForHeaderInSection
? La vista de tabla solo llamará a uno de los dos (se me olvida cuál tiene prioridad en este momento).viewForHeader
se llama sin ninguna de esas tres formas de asignar una altura. Me ha sucedido esto, donde meviewForHeader
llamaron y los encabezados aparecieron muy bien, hasta que un día, sin cambios de mi parte, no lo hicieron . Fue entonces cuando comencé a experimentar para descubrir cuáles son los requisitos mínimos paraviewForHeader
ser llamado. Y ahora lo se. Y ahora tú también.Dar
estimatedSectionHeaderHeight
y lossectionHeaderHeight
valores arreglaron mi problema. p.ej,self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
fuente
Saliendo de la respuesta de rmaddy, estaba tratando de ocultar la vista de encabezado y estaba volviendo 0.0f para "tableView: heightForHeaderInSection" y una vista de altura 0 desde
tableView:viewForHeaderInSection
.Después de cambiar de
return 1.0f
areturn 0.0f
intableView:heightForHeaderInSection
, el método delegadotableView:viewForHeaderInSection
fue llamado.Resulta que mi efecto deseado funciona sin tener que usar "tableView: heightForHeaderInSection"; pero esto puede ser útil para otras personas que tienen problemas para obtener el método de delegado "tableView: heightForHeaderInSection" llamado.
fuente
Debe implementar
tableView:heightForHeaderInSection:
y establecer la altura para el encabezado> 0.Este método delegado va junto con el
viewForHeaderInSection:
método.Espero que esto ayude.
fuente
Vale la pena señalar brevemente que si su implementación de
tableView:heightForHeaderInSection:
devolucionesUITableViewAutomaticDimension
,tableView:viewForHeaderInSection:
no se llamará.UITableViewAutomaticDimension
asume que seUITableViewHeaderFooterView
usará un estándar que se rellena con el método delegadotableView:titleForHeaderInSection:
.De los comentarios en
UITableView.h
:fuente
estimatedSectionHeaderHeight
algún valor,tableView:viewForHeaderInSection
se llamará (de forma similar a cómo funcionan las dimensiones automáticas para filas)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 estaba llamando a ninguno de los métodos de delegado de encabezado de sección, incluidos:
tableView:heightForHeaderInSection:
ytableView:viewForHeaderInSection:
.Después de experimentar, descubrí que la eliminación de esta línea de mis
viewDidLoad
encabezados hechos vuelve a aparecer para 7.1 y no afectaba a otras versiones que probé:... entonces, parece que hay algún tipo de conflicto allí para 7.1, al menos.
fuente
El mismo problema ocurrió conmigo, pero como estaba usando el cálculo automático de altura de xCode 9 , no puedo dar ningún valor de altura explícito como se mencionó anteriormente. Después de experimentar un poco, obtuve una solución , tenemos que anular este método ya que,
Aunque he marcado ambas opciones
del guión gráfico como dice apple, pero aún así recibí este extraño error.
Nota : este error se mostró solo en la versión IOS-10 , no en la versión IOS-11 . Tal vez es un error de xCode. Gracias
fuente
Esto es lo que he encontrado ( Swift 4 ) (gracias a este comentario en otra pregunta)
Si utilicé titleForHeaderInSection o viewForHeaderInSection, no era que no se les llamara cuando se desplazaba la vista de tabla y se cargaban nuevas celdas, sino que las opciones de fuente que hice para la etiqueta textView de headerView solo aparecían en lo que inicialmente era visible en la carga , y no como se desplazaba la mesa.
La solución fue willDisplayHeaderView:
fuente
En mi caso, he creado una vista de encabezado usando
UITableviewCell
y devolviendo la celda deviewForHeaderInSection
esta maneracambió esto a
Trabajó para mi.
fuente
En mi caso
se implementó en una clase derivada muy lejana que no se molestaba en convertirse en superclase.
fuente
La razón por la
viewForHeaderInSection
que no se llama es por una de dos razones:O no configuró su
UITableViewDelegate
, o configuró suUITableViewDelegate
incorrectamente.fuente
En mi caso fue porque no implementé:
fuente
A veces, configurar
tableview.delegate
odatasource = nil
en los métodosviewWillAppear:
oviewDidAppear:
puede causar este problema. Asegúrate de no hacer esto ...fuente
Había cortado y pegado 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 primer nombre del parámetro.
fuente