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 (viewForHeaderotitleForHeader).fuente
numberOfSections.titleForHeaderInSection:yviewForHeaderInSection:la vista devuelta por este último es una subclase de,UITableViewHeaderFooterViewentoncestextLabel.textse 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
UITableViewprotocolos diferentes :tableView:titleForHeaderInSection:es unUITableViewDataSourcemétodo de protocolo, al quetableView:viewForHeaderInSectionperteneceUITableViewDelegate.Eso significa:
Si implementa los métodos pero se asigna solo como
dataSourceparaUITableView, sutableView:viewForHeaderInSectionimplementación será ignorada.tableView:viewForHeaderInSectionTiene una mayor prioridad. Si implementa ambos métodos y se asigna a sí mismo como eldataSourceydelegatepara 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:viewForHeaderInSectionque funcione correctamente; así que para estar seguros, es aconsejable implementar esto también.fuente
UITableViewDelegateaself, porque pensé, quetableView:viewForHeaderInSectiones unUITableViewDataSourcemétodo. ¡Gracias!titleForHeaderque 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 tantotitleForHeaderyviewForHeader. Declararé la regla correctamente solo para el registro:La regla es simplemente que
viewForHeaderno 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
viewForHeaderno 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".titleForHeaderInSectionyviewForHeaderInSection? La vista de tabla solo llamará a uno de los dos (se me olvida cuál tiene prioridad en este momento).viewForHeaderse llama sin ninguna de esas tres formas de asignar una altura. Me ha sucedido esto, donde meviewForHeaderllamaron 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 paraviewForHeaderser llamado. Y ahora lo se. Y ahora tú también.Dar
estimatedSectionHeaderHeighty lossectionHeaderHeightvalores arreglaron mi problema. p.ej,self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimensionfuente
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.0fareturn 0.0fintableView:heightForHeaderInSection, el método delegadotableView:viewForHeaderInSectionfue 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á.UITableViewAutomaticDimensionasume que seUITableViewHeaderFooterViewusará un estándar que se rellena con el método delegadotableView:titleForHeaderInSection:.De los comentarios en
UITableView.h:fuente
estimatedSectionHeaderHeightalgún valor,tableView:viewForHeaderInSectionse 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
viewDidLoadencabezados 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
UITableviewCelly devolviendo la celda deviewForHeaderInSectionesta 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
viewForHeaderInSectionque no se llama es por una de dos razones:O no configuró su
UITableViewDelegate, o configuró suUITableViewDelegateincorrectamente.fuente
En mi caso fue porque no implementé:
fuente
A veces, configurar
tableview.delegateodatasource = nilen 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