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?
ios
uitableview
uitableviewsectionheader
inforeqd
fonte
fonte
heightForHeaderInSection:
implementado?sectionHeaderHeight
?Respostas:
O uso de
tableView:viewForHeaderInSection:
requer que você também implementetableView:heightForHeaderInSection:
. Isso deve retornar uma altura diferente de zero apropriada para o cabeçalho. Verifique também se você não implementou otableView:titleForHeaderInSection:
. Você deve usar apenas um ou outro (viewForHeader
outitleForHeader
).fonte
numberOfSections
.titleForHeaderInSection:
eviewForHeaderInSection:
a exibição retornada deste último é uma subclasse,UITableViewHeaderFooterView
então eletextLabel.text
é automaticamente definido para a versão all-caps datitleForHeaderInSection:
string. Para evitar esse comportamento, não implementetitleForHeaderInSection:
ou use um rótulo personalizado em vez do herdadotextLabel
.O truque é que esses dois métodos pertencem a
UITableView
protocolos diferentes :tableView:titleForHeaderInSection:
é umUITableViewDataSource
método de protocolo ao qualtableView:viewForHeaderInSection
pertenceUITableViewDelegate
.Que significa:
Se você implementar os métodos, mas se atribuir apenas como
dataSource
forUITableView
, suatableView:viewForHeaderInSection
implementação será ignorada.tableView:viewForHeaderInSection
tem uma prioridade mais alta. Se você implementar ambos os métodos e atribuir-se como tanto odataSource
eodelegate
para oUITableView
, você vai voltar as vistas para cabeçalhos de seção, mas o seutableView: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 paratableView:viewForHeaderInSection
que funcione corretamente; para estar seguro, é aconselhável implementar isso também.fonte
UITableViewDelegate
aself
, porque eu pensei, quetableView:viewForHeaderInSection
é umUITableViewDataSource
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 implementetableView:heightForHeaderInSection:
, e também é perfeitamente bom chamar ambostitleForHeader
eviewForHeader
. 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.fonte
tableView:viewForHeaderInSection:
: "Este método só funciona corretamente quandotableView:heightForHeaderInSection:
também é implementado.".titleForHeaderInSection
eviewForHeaderInSection
? 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 meuviewForHeader
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 devemviewForHeader
ser chamados. E agora eu sei. E agora você também.Doações
estimatedSectionHeaderHeight
esectionHeaderHeight
valores corrigiram meu problema. por exemplo,self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
fonte
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
parareturn 0.0f
dentrotableView:heightForHeaderInSection
, o método delegadotableView: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.
fonte
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.
fonte
Vale a pena notar brevemente que, se sua implementação de
tableView:heightForHeaderInSection:
retornosUITableViewAutomaticDimension
,tableView:viewForHeaderInSection:
não será chamada.UITableViewAutomaticDimension
pressupõe queUITableViewHeaderFooterView
será usado um padrão preenchido com o método delegatetableView:titleForHeaderInSection:
.Dos comentários no
UITableView.h
:fonte
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:
etableView: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:… Então parece que há algum tipo de conflito por 7.1, pelo menos.
fonte
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,
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
fonte
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:
fonte
No meu caso, criei a visualização de cabeçalho usando
UITableviewCell
e retornando a célulaviewForHeaderInSection
dessa maneiramudou isso para
Trabalhou para mim.
fonte
No meu caso
foi implementado em uma classe derivada muito distante que não se incomodava em transformar em superclasse.
fonte
O motivo pelo qual
viewForHeaderInSection
não é chamado é por um de dois motivos:Você não configurou o seu
UITableViewDelegate
ou configurou o seuUITableViewDelegate
incorretamente.fonte
No meu caso, foi porque eu não implementei:
fonte
Às vezes, a configuração
tableview.delegate
oudatasource = nil
nos métodosviewWillAppear:
ouviewDidAppear:
pode causar esse problema. Certifique-se de não fazer isso ...fonte
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.
fonte