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 ( viewForHeadero titleForHeader).
numberOfSections.
titleForHeaderInSection:e se viewForHeaderInSection:la vista restituita da quest'ultima è una sottoclasse di UITableViewHeaderFooterViewallora textLabel.textviene 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 UITableViewprotocolli diversi : tableView:titleForHeaderInSection:è un UITableViewDataSourcemetodo di protocollo, a cui tableView:viewForHeaderInSectionappartiene UITableViewDelegate.
Questo significa:
Se implementate i metodi ma vi assegnate solo come
dataSourceper il UITableView, l'
tableView:viewForHeaderInSectionimplementazione verrà ignorata.
tableView:viewForHeaderInSectionha una priorità più alta. Se si implementa entrambi i metodi e assegnare te stesso come sia la
dataSourcee delegateper 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:viewForHeaderInSectioncorretto funzionamento; quindi per sicurezza è opportuno implementare anche questo.
UITableViewDelegatea self, perché ho pensato, che tableView:viewForHeaderInSectionè un UITableViewDataSourcemetodo. Grazie!
titleForHeaderche 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 titleForHeadereviewForHeader . Dichiarerò la regola correttamente solo per la cronaca:
La regola è semplicemente che viewForHeadernon 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 viewForHeadernon 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."
titleForHeaderInSectione 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 è viewForHeaderstato 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 viewForHeaderessere chiamati. E ora lo so. E ora anche tu.
Dare estimatedSectionHeaderHeighte sectionHeaderHeightvalori 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.0fa return 0.0fin tableView:heightForHeaderInSection, è tableView:viewForHeaderInSectionstato 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.
UITableViewAutomaticDimensionpresuppone che UITableViewHeaderFooterViewverrà 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.
estimatedSectionHeaderHeightsu un valore, tableView:viewForHeaderInSectionverrà 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 viewDidLoadintestazioni 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 UITableviewCelle restituendo la cella in viewForHeaderInSectionquesto 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 viewForHeaderInSectionnon viene chiamato è per uno dei due motivi:
O non hai impostato il tuo UITableViewDelegateo hai impostato il tuo in UITableViewDelegatemodo 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 è?