2015-03-09 8 views
10

Ho una vista tabella raggruppata statica che ha 5 sezioni (tutte le sezioni hanno intestazioni, nessun piè di pagina). Ho creato tutto questo usando uno Storyboard. Ora, come posso nascondere il primo/alto UITableViewSection (inclusa l'intestazione). Ho provato a fare uno sbocco al UITableViewSection ma mi dice che non è valido (tipo non dichiarato):Come nascondere UITableViewSections in Swift?

@IBOutlet var section: UITableViewSection! 

ho fatto in questo modo perché stavo pensando di fare:

section.hidden = true 

Can esso non essere fatto in questo modo?

I miei delegati e le origini dati sono impostati correttamente al 100%.

risposta

11

È possibile utilizzare il metodo delegato:

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    if(section == 0) 
    return 0.0 
} 

Se si vuole non le cellule in una particolare sezione, utilizzare il metodo delegato:

func numberOfRowsInSection(section: Int) -> Int { 
    if (section == 0) { 
    return 0 
    } 
    else { 
    // return the number of rows you want 
    } 
} 

EDIT (Rivolgendosi Tim 's commento)

Per ottenere la sintassi corretta:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    if (section == 0) { 
     return 0.0 
    } 
    return UITableViewAutomaticDimension 
} 

O per una sintassi più ordinato switch-case:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    switch section { 
    case 0: 
     return 0.0 
    default: 
     return UITableViewAutomaticDimension 
    } 
} 

ho provato entrambi e stanno lavorando bene.

+0

Cosa succede se il TableView è statico (alcuni hardcoded diversi tra loro, come una finestra delle impostazioni)? – Josh

+0

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

+1

Nascondere le righe e impostare le righe come altezza 0 causava problemi con i miei vincoli. Questa risposta ha risolto quella, bella soluzione! –

1

0.0 non ha funzionato per me. Dovevo farlo per farlo funzionare.

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 

    switch section { 
    case 0: 
     return 0.01 
    default: 
     return UITableViewAutomaticDimension 
    } 
} 
0

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:

  1. Impostare il tableView come per la risposta eccellente @sasquatch dato sopra.
  2. 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.

Problemi correlati