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í?
sectionHeaderHeight
?
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í?
sectionHeaderHeight
?
Respuestas:
El uso de tableView:viewForHeaderInSection:
requiere que también implemente tableView:heightForHeaderInSection:
. Esto debería devolver una altura distinta de cero para el encabezado. También asegúrese de no implementar también el tableView:titleForHeaderInSection:
. Solo debe usar uno u otro ( viewForHeader
o titleForHeader
).
numberOfSections
.
titleForHeaderInSection:
y viewForHeaderInSection:
la vista devuelta por este último es una subclase de, UITableViewHeaderFooterView
entonces textLabel.text
se establece automáticamente en la versión en mayúsculas de la titleForHeaderInSection:
cadena. Para evitar este comportamiento, no implemente titleForHeaderInSection:
ni use una etiqueta personalizada en lugar de la heredada textLabel
.
El truco es que esos dos métodos pertenecen a UITableView
protocolos diferentes : tableView:titleForHeaderInSection:
es un UITableViewDataSource
método de protocolo, al que tableView:viewForHeaderInSection
pertenece UITableViewDelegate
.
Eso significa:
Si implementa los métodos pero se asigna solo como
dataSource
para UITableView
, su
tableView:viewForHeaderInSection
implementación será ignorada.
tableView:viewForHeaderInSection
Tiene una mayor prioridad. Si implementa ambos métodos y se asigna a sí mismo como el
dataSource
y delegate
para el UITableView
, devolverá las vistas para los encabezados de sección, pero
tableView: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 para tableView:viewForHeaderInSection
que funcione correctamente; así que para estar seguros, es aconsejable implementar esto también.
UITableViewDelegate
a self
, porque pensé, que tableView:viewForHeaderInSection
es un UITableViewDataSource
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én tableView:heightForHeaderInSection:
, y también está perfectamente bien para llamar tanto titleForHeader
y viewForHeader
. 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.
tableView:viewForHeaderInSection:
: "Este método solo funciona correctamente cuando tableView:heightForHeaderInSection:
también se implementa".
titleForHeaderInSection
y viewForHeaderInSection
? 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 me viewForHeader
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 para viewForHeader
ser llamado. Y ahora lo se. Y ahora tú también.
Dar estimatedSectionHeaderHeight
y los sectionHeaderHeight
valores arreglaron mi problema. p.ej,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
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
a return 0.0f
in 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 otras personas que tienen problemas para obtener el método de delegado "tableView: heightForHeaderInSection" llamado.
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.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
Vale la pena señalar brevemente que si su implementación de tableView:heightForHeaderInSection:
devoluciones UITableViewAutomaticDimension
, tableView:viewForHeaderInSection:
no se llamará.
UITableViewAutomaticDimension
asume que se UITableViewHeaderFooterView
usará un estándar que se rellena con el método delegado tableView:titleForHeaderInSection:
.
De los comentarios en UITableView.h
:
Si se devuelve este valor
tableView:heightForHeaderInSection:
o setableView:heightForFooterInSection:
obtiene una altura que se ajusta al valor devueltotableView:titleForHeaderInSection:
otableView:titleForFooterInSection:
si el título no es nulo.
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:
y tableView: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é:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
... entonces, parece que hay algún tipo de conflicto allí para 7.1, al menos.
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,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
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
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:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel?.font = UIFont(name: yourFont, size: 42)
}
}
En mi caso, he creado una vista de encabezado usando UITableviewCell
y devolviendo la celda de viewForHeaderInSection
esta manera
return cell
cambió esto a
return cell.contentView
Trabajó para mi.
En mi caso
viewForHeaderInSection
se implementó en una clase derivada muy lejana que no se molestaba en convertirse en superclase.
La razón por la viewForHeaderInSection
que no se llama es por una de dos razones:
O no configuró su UITableViewDelegate
, o configuró su UITableViewDelegate
incorrectamente.
En mi caso fue porque no implementé:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
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.
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
}
heightForHeaderInSection:
implementado?