Eu configurei a tableview com as conexões corretas de delegado e de fonte de dados. O método reloadData chama os métodos de fonte de dados e de delegação, exceto viewForHeaderInSection:
.
Por que?
sectionHeaderHeight
?
Eu configurei a tableview com as conexões corretas de delegado e de fonte de dados. O método reloadData chama os métodos de fonte de dados e de delegação, exceto viewForHeaderInSection:
.
Por que?
sectionHeaderHeight
?
Respostas:
O uso de tableView:viewForHeaderInSection:
requer que você também implemente tableView:heightForHeaderInSection:
. Isso deve retornar uma altura diferente de zero apropriada para o cabeçalho. Verifique também se você não implementou o tableView:titleForHeaderInSection:
. Você deve usar apenas um ou outro ( viewForHeader
ou titleForHeader
).
numberOfSections
.
titleForHeaderInSection:
e viewForHeaderInSection:
a exibição retornada deste último é uma subclasse, UITableViewHeaderFooterView
então ele textLabel.text
é automaticamente definido para a versão all-caps da titleForHeaderInSection:
string. Para evitar esse comportamento, não implemente titleForHeaderInSection:
ou use um rótulo personalizado em vez do herdado textLabel
.
O truque é que esses dois métodos pertencem a UITableView
protocolos diferentes : tableView:titleForHeaderInSection:
é um UITableViewDataSource
método de protocolo ao qual tableView:viewForHeaderInSection
pertence UITableViewDelegate
.
Que significa:
Se você implementar os métodos, mas se atribuir apenas como
dataSource
for UITableView
, sua
tableView:viewForHeaderInSection
implementação será ignorada.
tableView:viewForHeaderInSection
tem uma prioridade mais alta. Se você implementar ambos os métodos e atribuir-se como tanto o
dataSource
eo delegate
para o UITableView
, você vai voltar as vistas para cabeçalhos de seção, mas o seu
tableView:titleForHeaderInSection:
será ignorado.
Eu também tentei remover tableView:heightForHeaderInSection:
; funcionou bem e não pareceu afetar os procedimentos acima. Mas a documentação diz que é necessário para tableView:viewForHeaderInSection
que funcione corretamente; para estar seguro, é aconselhável implementar isso também.
UITableViewDelegate
a self
, porque eu pensei, que tableView:viewForHeaderInSection
é um UITableViewDataSource
método. Obrigado!
titleForHeader
que tenha um tamanho intrínseco. O tamanho intrínseco é calculado com base na família e no tamanho da fonte.
O @rmaddy deturpou a regra duas vezes: na realidade, tableView:viewForHeaderInSection:
não é necessário que você também implemente tableView:heightForHeaderInSection:
, e também é perfeitamente bom chamar ambos titleForHeader
e viewForHeader
. Vou declarar a regra corretamente apenas para o registro:
A regra é simplesmente que viewForHeader
não será chamada, a menos que você dê uma altura ao cabeçalho. Você pode fazer isso de qualquer maneira, de três maneiras:
Implementar tableView:heightForHeaderInSection:
.
Coloque as mesas sectionHeaderHeight
.
Chamada titleForHeader
(isso de alguma forma atribui ao cabeçalho uma altura padrão, caso contrário não a possui).
Se você não fizer nada disso, não terá cabeçalhos e viewForHeader
não será chamado. Isso porque, sem altura, o tempo de execução não saberá como redimensionar a exibição, portanto, não se preocupe em pedir uma.
tableView:viewForHeaderInSection:
: "Este método só funciona corretamente quando tableView:heightForHeaderInSection:
também é implementado.".
titleForHeaderInSection
e viewForHeaderInSection
? A exibição da tabela chamará apenas um dos dois (eu esqueço o que tem precedência no momento).
viewForHeader
é chamada sem nenhuma dessas três maneiras de atribuir uma altura. Eu tive isso acontecer, onde meu viewForHeader
foi chamado e os cabeçalhos apareceram muito bem, até que um dia, sem nenhuma alteração da minha parte, eles não o fizeram . Foi quando comecei a experimentar para descobrir como os requisitos mínimos devem viewForHeader
ser chamados. E agora eu sei. E agora você também.
Doações estimatedSectionHeaderHeight
e sectionHeaderHeight
valores corrigiram meu problema. por exemplo,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
Seguindo a resposta de rmaddy, eu estava tentando ocultar a visualização do cabeçalho e retornava 0,0f para "tableView: heightForHeaderInSection" e uma visualização de 0 de altura tableView:viewForHeaderInSection
.
Depois de mudar de return 1.0f
para return 0.0f
dentro tableView:heightForHeaderInSection
, o método delegado tableView:viewForHeaderInSection
foi realmente chamado.
Acontece que o efeito desejado funciona sem ter que usar "tableView: heightForHeaderInSection"; mas isso pode ser útil para outras pessoas que estão tendo problemas ao obter o método delegado "tableView: heightForHeaderInSection" chamado.
Você deve implementar tableView:heightForHeaderInSection:
e definir a altura do cabeçalho> 0.
Este método delegado acompanha o viewForHeaderInSection:
método.
Eu espero que isso ajude.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
Vale a pena notar brevemente que, se sua implementação de tableView:heightForHeaderInSection:
retornos UITableViewAutomaticDimension
, tableView:viewForHeaderInSection:
não será chamada.
UITableViewAutomaticDimension
pressupõe que UITableViewHeaderFooterView
será usado um padrão preenchido com o método delegate tableView:titleForHeaderInSection:
.
Dos comentários no UITableView.h
:
Retornar esse valor de
tableView:heightForHeaderInSection:
outableView:heightForFooterInSection:
resultar em uma altura que corresponda ao valor retornado detableView:titleForHeaderInSection:
outableView:titleForFooterInSection:
se o título não for nulo.
estimatedSectionHeaderHeight
a algum valor, tableView:viewForHeaderInSection
será chamado (da mesma forma como dimensões de automóveis para linhas funciona)
Acabei de ter um problema com os cabeçalhos que não aparecem no iOS 7.1 , mas funcionando bem com versões posteriores que testei, explicitamente com 8.1 e 8.4.
Para o mesmo código, o 7.1 não estava chamando nenhum dos métodos de delegação do cabeçalho da seção, incluindo: tableView:heightForHeaderInSection:
e tableView:viewForHeaderInSection:
.
Após a experimentação, descobri que a remoção dessa linha dos viewDidLoad
cabeçalhos criados reaparecia no 7.1 e não afetou outras versões que testei:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
… Então parece que há algum tipo de conflito por 7.1, pelo menos.
O mesmo problema ocorreu comigo, mas como estava usando o cálculo automático de altura do xCode 9 , não posso fornecer nenhum valor explícito de altura, como mencionado acima. Após algumas experiências, obtive a solução , precisamos substituir esse método como,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
Embora eu tenha marcado as duas opções
do storyboard como a Apple diz, mas ainda assim recebi esse erro estranho.
Nota : Este erro foi mostrado apenas na versão IOS-10 e não na versão IOS-11 . Talvez seja um bug do xCode. obrigado
Aqui está o que eu encontrei ( Swift 4 ) (graças a este comentário em outra pergunta)
Se eu usei titleForHeaderInSection ou viewForHeaderInSection - não era que eles não estavam sendo chamados quando a tableview foi rolada e novas células estavam sendo carregadas, mas qualquer opção de fonte que eu fiz para o textLabel do headerView estava aparecendo apenas no inicialmente visível no carregamento , e não como a tabela foi rolada.
A correção foi 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)
}
}
No meu caso, criei a visualização de cabeçalho usando UITableviewCell
e retornando a célula viewForHeaderInSection
dessa maneira
return cell
mudou isso para
return cell.contentView
Trabalhou para mim.
No meu caso
viewForHeaderInSection
foi implementado em uma classe derivada muito distante que não se incomodava em transformar em superclasse.
O motivo pelo qual viewForHeaderInSection
não é chamado é por um de dois motivos:
Você não configurou o seu UITableViewDelegate
ou configurou o seu UITableViewDelegate
incorretamente.
No meu caso, foi porque eu não implementei:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
Eu recortei e colei os dois métodos a seguir de um projeto Swift 2 no meu projeto Swift 3, que nunca foram chamados, porque no Swift 3 esses métodos devem ter "-" antes do nome do primeiro 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?