Ho impostato la vista tabella con collegamenti delegato e origine dati corretti. Il metodo reloadData chiama l'origine dati e i metodi delegato tranne viewForHeaderInSection:
.
Perchè è così?
sectionHeaderHeight
?
Ho impostato la vista tabella con collegamenti delegato e origine dati corretti. Il metodo reloadData chiama l'origine dati e i metodi delegato tranne viewForHeaderInSection:
.
Perchè è così?
sectionHeaderHeight
?
Risposte:
L'uso di tableView:viewForHeaderInSection:
richiede anche l'implementazione tableView:heightForHeaderInSection:
. Ciò dovrebbe restituire un'altezza diversa da zero appropriata per l'intestazione. Assicurati anche di non implementare anche il tableView:titleForHeaderInSection:
. Dovresti usare solo l'uno o l'altro ( viewForHeader
o titleForHeader
).
numberOfSections
.
titleForHeaderInSection:
e se viewForHeaderInSection:
la vista restituita da quest'ultima è una sottoclasse di UITableViewHeaderFooterView
allora textLabel.text
viene automaticamente impostata sulla versione maiuscola della titleForHeaderInSection:
stringa. Per impedire questo comportamento, non implementare titleForHeaderInSection:
né utilizzare un'etichetta personalizzata anziché ereditata textLabel
.
Il trucco è che questi due metodi appartengono a UITableView
protocolli diversi : tableView:titleForHeaderInSection:
è un UITableViewDataSource
metodo di protocollo, a cui tableView:viewForHeaderInSection
appartiene UITableViewDelegate
.
Questo significa:
Se implementate i metodi ma vi assegnate solo come
dataSource
per il UITableView
, l'
tableView:viewForHeaderInSection
implementazione verrà ignorata.
tableView:viewForHeaderInSection
ha una priorità più alta. Se si implementa entrambi i metodi e assegnare te stesso come sia la
dataSource
e delegate
per la UITableView
, si tornerà il punto di vista per intestazioni di sezione, ma il vostro
tableView:titleForHeaderInSection:
sarà ignorato.
Ho anche provato a rimuovere tableView:heightForHeaderInSection:
; ha funzionato bene e non sembra aver influenzato le procedure sopra. Ma la documentazione afferma che è necessario per il tableView:viewForHeaderInSection
corretto funzionamento; quindi per sicurezza è opportuno implementare anche questo.
UITableViewDelegate
a self
, perché ho pensato, che tableView:viewForHeaderInSection
è un UITableViewDataSource
metodo. Grazie!
titleForHeader
che ha una dimensione intrinseca. La dimensione intrinseca viene calcolata in base alla famiglia e alla dimensione del carattere.
@rmaddy ha errati la regola, due volte: in realtà, tableView:viewForHeaderInSection:
non senza richiedere che anche di implementare tableView:heightForHeaderInSection:
, ed inoltre è perfettamente bene di chiamare sia titleForHeader
eviewForHeader
. Dichiarerò la regola correttamente solo per la cronaca:
La regola è semplicemente che viewForHeader
non verrà chiamata a meno che tu non dia in qualche modo altezza all'intestazione. Puoi farlo in qualsiasi combinazione di tre modi:
Implementare tableView:heightForHeaderInSection:
.
Prepara il tavolo sectionHeaderHeight
.
Chiama titleForHeader
(questo in qualche modo dà all'intestazione un'altezza predefinita se non ne ha altrimenti).
Se non fai nessuna di queste cose, non avrai intestazioni e viewForHeader
non verrai chiamato. Questo perché senza un'altezza, il runtime non saprà come ridimensionare la vista, quindi non si preoccupa di richiederne uno.
tableView:viewForHeaderInSection:
: "Questo metodo funziona correttamente solo quando tableView:heightForHeaderInSection:
è implementato."
titleForHeaderInSection
e viewForHeaderInSection
? La vista tabella chiamerà solo una delle due (dimentico quale al momento ha la precedenza).
viewForHeader
viene chiamato senza nessuno di quei tre modi di assegnare un'altezza. Ho avuto questo accadere, dove il mio è viewForHeader
stato chiamato e le intestazioni si sono presentate bene, fino a quando un giorno, senza alcun cambiamento da parte mia, non lo hanno fatto . In quel momento ho iniziato a sperimentare per scoprire quali sono i requisiti minimi per viewForHeader
essere chiamati. E ora lo so. E ora anche tu.
Dare estimatedSectionHeaderHeight
e sectionHeaderHeight
valori hanno risolto il mio problema. per esempio,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
Uscendo dalla risposta di rmaddy, stavo cercando di nascondere la vista Header e stavo restituendo 0.0f per "tableView: heightForHeaderInSection" e una vista 0 altezza da tableView:viewForHeaderInSection
.
Dopo essere passato da return 1.0f
a return 0.0f
in tableView:heightForHeaderInSection
, è tableView:viewForHeaderInSection
stato effettivamente chiamato il metodo delegato .
Risulta che l'effetto desiderato funziona senza dover usare "tableView: heightForHeaderInSection"; ma questo può essere utile per gli altri che stanno riscontrando problemi nell'ottenere il metodo delegato "tableView: heightForHeaderInSection".
Dovresti implementare tableView:heightForHeaderInSection:
e impostare l'altezza per l'intestazione> 0.
Questo metodo delegato si accompagna a viewForHeaderInSection:
metodo.
Spero che aiuti.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
Vale la pena notare brevemente che se la tua implementazione di tableView:heightForHeaderInSection:
resi UITableViewAutomaticDimension
, alloratableView:viewForHeaderInSection:
non verrà chiamata.
UITableViewAutomaticDimension
presuppone che UITableViewHeaderFooterView
verrà utilizzato uno standard popolato con il metodo delegato tableView:titleForHeaderInSection:
.
Dai commenti in UITableView.h
:
La restituzione di questo valore da
tableView:heightForHeaderInSection:
otableView:heightForFooterInSection:
risulta in un'altezza adatta al valore restituito datableView:titleForHeaderInSection:
otableView:titleForFooterInSection:
se il titolo non è zero.
estimatedSectionHeaderHeight
su un valore, tableView:viewForHeaderInSection
verrà chiamato (analogamente a come funzionano le dimensioni automatiche per le righe)
Ho appena avuto un problema con le intestazioni che non vengono visualizzate per iOS 7.1 , ma lavorando bene con le versioni successive che ho testato, esplicitamente con 8.1 e 8.4.
Per lo stesso identico codice, 7.1 non chiamava affatto nessuno dei metodi delegati dell'intestazione di sezione, inclusi: tableView:heightForHeaderInSection:
e tableView:viewForHeaderInSection:
.
Dopo la sperimentazione, ho scoperto che la rimozione di questa riga dalle viewDidLoad
intestazioni create riappariva per 7.1 e non ha avuto alcun impatto su altre versioni che ho testato:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
... quindi, sembra esserci un qualche tipo di conflitto lì per 7.1, almeno.
Lo stesso problema si è verificato con me, ma poiché stavo usando il calcolo automatico dell'altezza da xCode 9 , non posso fornire alcun valore di altezza esplicito come menzionato sopra. Dopo un po 'di sperimentazione ho ottenuto una soluzione , dobbiamo ignorare questo metodo come
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
Anche se ho controllato entrambe le opzioni
dallo storyboard come dice apple, ma ho ancora questo strano errore.
Nota : questo errore è stato mostrato solo sulla versione IOS-10 e non sulla versione IOS-11 . Forse è un bug di xCode. Grazie
Ecco cosa ho trovato ( Swift 4 ) (grazie a questo commento su un'altra domanda)
Sia che avessi usato titleForHeaderInSection o viewForHeaderInSection - non era che non venivano richiamati quando si scorreva la vista tabella e venivano caricate nuove celle, ma tutte le scelte di carattere che avevo fatto per l'etichetta text di headerView comparivano solo su ciò che era inizialmente visibile al caricamento e non durante lo scorrimento della tabella.
La correzione era 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)
}
}
Nel mio caso ho creato la vista dell'intestazione usando UITableviewCell
e restituendo la cella in viewForHeaderInSection
questo modo
return cell
modificato in
return cell.contentView
Ha funzionato per me.
Nel mio caso
viewForHeaderInSection
è stato implementato in una classe derivata molto lontana che non si preoccupava di creare una superclasse.
Il motivo per cui viewForHeaderInSection
non viene chiamato è per uno dei due motivi:
O non hai impostato il tuo UITableViewDelegate
o hai impostato il tuo in UITableViewDelegate
modo errato.
Nel mio caso è stato perché non ho implementato:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
Ho tagliato e incollato i seguenti due metodi da un progetto Swift 2 nel mio progetto Swift 3 che non sono mai stati chiamati perché in Swift 3 questi metodi devono avere "-" prima del nome del primo parametro.
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:
implementazione è?