Per chi vuole nascondere le sezioni perché usano un tableView raggruppato statica con un numero variabile di sezioni, la soluzione qui di seguito possono essere di aiuto. Nel mio caso, ogni sezione con dati da visualizzare doveva avere un'intestazione personalizzata. Qualsiasi sezione che non aveva dati, doveva essere nascosta completamente.
La risposta sopra è stata di grande aiuto nel mio scenario. Tuttavia, per coloro che non sanno sempre quale sezione (s) dovrà essere nascosta qui è una soluzione per voi che si estende su quanto sopra.
Nel mio scenario, ho fino a 12 voci in una matrice che voglio mostrare in un massimo di 12 sezioni (tra le altre sezioni in una tabellaView raggruppata). Se ci sono meno di 12 voci da visualizzare, voglio nascondere le sezioni non necessarie dando loro 0 altezza e 0 righe. Volevo anche nascondere l'headerView.
Per fare questo, ho fatto la seguente:
- Impostare il tableView come per la risposta eccellente @sasquatch dato sopra.
- Nella sezione numberOfRowsInSection (sezione: Int) e tableView (_ tableView: UITableView, heightForHeaderInSection: Int), controllare se le righe/altezza devono essere 0.
Nel mio caso, ero utilizzando sezioni 1 - 12 per miei dati dinamici così ho usato codice come di seguito:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//For section 0 and 13, just 1 row is ok
if section == 0 || section == 13 {
return 1
}
//For sections 1 - 12, determine if we have data to populate it, or if we should hide it
if section <= dynamicDataToDisplay.count {
return 2
}
//If it's section 1 - 12, but we don't have a corresponding data entry in dynamicDataToDisplay, then just return 0 rows
return 0
}
Il codice per la funzione heightForHeader è simile in logica:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
switch section {
case 0:
return 45.0
case 13:
return UITableViewAutomaticDimension
default:
if dynamicDataToDisplay.count >= section {
return 25.0
} else {
return 0.0
}
} //end switch
}
Anche dopo aver impostato queste funzioni, ho scoperto che stavo ancora ricevendo intestazioni per le sezioni che volevo nascondere. Credo che ho pensato che viewForHeaderInSection non sarebbe stato chiamato se il numeroOfRows era 0 e heightOfHeader era anche 0, ma era ancora chiamato.
aggiungendo la seguente contribuito a garantire che l'intestazione non è stato inutilmente creato:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
//set up header for dynamic data sections
if 1 ... 12 ~= section {
if tableView.numberOfRows(inSection: section) == 0 {
return nil
}
//Continue with the header set up for valid sections with rows to display data
......
}
}
Questa soluzione potrebbe aiutare chi sta ancora ricevendo un colpo di testa in fase di creazione, nonostante la sua altezza e le righe di essere impostato a 0.
Cosa succede se il TableView è statico (alcuni hardcoded diversi tra loro, come una finestra delle impostazioni)? – Josh
A partire da Xcode 7.3, Swift 2.2: in alternativa a 'tableView (_: heightForHeaderInSection)', è anche possibile eseguire l'override di 'tableView (_: titleForHeaderInSection)' e restituire 'nil' quando si desidera nascondere l'intestazione. Quindi la sezione heder height verrà regolata automaticamente su 0 per non mostrare testo. – maganap
Nascondere le righe e impostare le righe come altezza 0 causava problemi con i miei vincoli. Questa risposta ha risolto quella, bella soluzione! –