2012-03-16 13 views
60

ho un UITableView, che visualizza le spese da un mese corrente (vedi screenshot):UITableView: Nascondi intestazione dalla sezione vuota

Il mio problema è con l'intestazione per le sezioni vuote. c'è un modo per nasconderli? I dati vengono caricati da coredata.

questo è il codice che genera il titolo di testa:

TitleForHeader

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { 
    return nil; 
} else { 

NSDate *today = [NSDate date ]; 
int todayInt = [dataHandler getDayNumber:today].intValue; 

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:(-(todayInt-section-1)*60*60*24)]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]]];  
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
NSString *formattedDateString = [dateFormatter stringFromDate:date]; 
    return formattedDateString;} 

} 

ViewForHeader

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ 
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { 
    return nil; 
} else { 

    UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 312, 30)]; 
    UILabel *title = [[UILabel alloc]initWithFrame:CGRectMake(4, 9, 312, 20)]; 
    UIView *top = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 312, 5)]; 
    UIView *bottom = [[UIView alloc]initWithFrame:CGRectMake(0, 5, 312, 1)]; 

    [top setBackgroundColor:[UIColor lightGrayColor]]; 
    [bottom setBackgroundColor:[UIColor lightGrayColor]]; 

    [title setText:[expenseTable.dataSource tableView:tableView titleForHeaderInSection:section]]; 
    [title setTextColor:[UIColor darkGrayColor]]; 
    UIFont *fontName = [UIFont fontWithName:@"Cochin-Bold" size:15.0]; 
    [title setFont:fontName]; 


    [headerView addSubview:title]; 
    [headerView addSubview:top]; 
    [headerView addSubview:bottom]; 

    return headerView; 

} 

} 

heightForHeader

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 

NSLog(@"Height: %d",[tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0); 
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section == 0]) { 
    return 0; 
} else { 
    return 30; 
} 
} 

numberOfRow sInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

int rows = 0; 
for (Expense* exp in [dataHandler allMonthExpenses]) { 
    if ([exp day].intValue == section) { 
     rows++; 
    } 
} 

return rows; 
} 

enter image description here sebastian

risposta

45

E se in - tableView:viewForHeaderInSection: si return nil se il conteggio sezione è 0.

EDIT: È possibile utilizzare numberOfRowsInSection per ottenere il numero di elementi nella sezione.

EDIT: Probabilmente si dovrebbe restituire nil anche in titleForHeaderInSection se numberOfRowsInSection è 0.

EDIT: Hai implementare il metodo seguente?

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

EDIT: Swift 3 esempio

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    switch section { 
    case 0: 
     if self.tableView(tableView, numberOfRowsInSection: section) > 0 { 
      return "Title example for section 1" 
     } 
    case 1: 
     if self.tableView(tableView, numberOfRowsInSection: section) > 0 { 
      return "Title example for section 2" 
     } 
    default: 
     return nil // when return nil no header will be shown 
    } 
    return nil 
} 
+1

malato cinque un tentativo - appena andato fuori per il pranzo ;-) mal posta i risultati non appena torno sul pc. grazie :-) –

+0

purtroppo non funziona .. ho aggiornato la domanda con un nuovo codice e un nuovo screenshot. –

+0

hai ricevuto qualche tipo di errore? – LuisEspinoza

10

Date un'occhiata al metodo -[UITableViewDelegate tableView:heightForHeaderInSection:]. In particolare la nota che accompagna la sua documentazione:

Prima di iOS 5.0, vista tabella sarebbe ridimensionare automaticamente le altezze di intestazioni a 0 per le sezioni in cui tableView:viewForHeaderInSection: restituito un panorama nil. In iOS 5.0 e versioni successive, è necessario restituire l'altezza effettiva di per ogni intestazione di sezione in questo metodo.

+0

grazie così mch ragazzi - ti aggiorno in un paio d'ore e accetti e superi qualunque cosa abbia funzionato al meglio :-) –

+1

purtroppo non funziona .. ho aggiornato la domanda con il nuovo codice & un nuovo screenshot. –

128

È necessario impostare tableView:heightForHeaderInSection: su 0 per le sezioni appropriate. Questo è qualcosa che è cambiato abbastanza recentemente e mi ha portato in un paio di posti. Da UITableViewDelegate si dice ...

Prima di iOS 5.0, vista tabella sarebbe ridimensionare automaticamente le altezze di intestazioni a 0 per le sezioni in cui tableView: viewForHeaderInSection: restituito una vista pari a zero. In iOS 5.0 e versioni successive, è necessario restituire l'altezza effettiva di per ogni intestazione di sezione in questo metodo.

Quindi dovrete fare qualcosa di simile

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { 
     return 0; 
    } else { 
     // whatever height you'd want for a real section header 
    } 
} 
+0

purtroppo non funziona .. ho aggiornato la domanda con un nuovo codice e un nuovo screenshot. –

+0

non funziona con iOS 6 e celle di tabella statiche – helioz

+2

Le tabelle statiche sono leggermente diverse. Questo codice è per visualizzazioni di intestazione di tabella personalizzate, non solo un 'titolo'. Se stai impostando un 'title', dovrai restituire' nil' per la chiamata di metodo 'tableView: titleForHeaderInSection:' quando appropriato. Se si stanno utilizzando le visualizzazioni di intestazione personalizzate, è necessario eseguire l'override di 'viewForHeaderInSection'. Se lo fai, questo codice dovrebbe funzionare. In caso contrario, avrei bisogno di ulteriori informazioni per aiutare con il problema. – DBD

9

So che questa è una vecchia questione, ma vorrei aggiungere ad essa. Preferisco l'approccio di impostare lo titleHeader su zero modificando lo heightForHeaderInSection su 0 in quanto può causare problemi con indexPath di +1 da dove dovrebbe essere dovuto all'intestazione ancora presente ma nascosta.

Quindi, con questo detto e sulla base DBD's answer è possibile impostare il titleForHeaderInSection: a zero per le sezioni senza righe in questo modo:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { 
     return nil; 
    } else { 
     // return your normal return 
    } 
} 
44

Nella mia situazione strana devo tornare:

viewForHeaderInSection -> nil

viewForFooterInSection -> nil (! non dimenticare piè di pagina)

heightForHeaderInSection ->0.01 (! Non zero)

heightForFooterInSection -> 0,01

solo in questo caso le sezioni vuote scompaiono completamente

+9

L'ho fatto solo impostando headerHeight su 0.01. –

+1

iOS 8.4 ho potuto ancora vedere il testo utilizzando 0,01, ma 0.0 lavorato tableView fascino di override func (tableView: UITableView, sezione heightForHeaderInSection: Int) -> CGFloat { se sectionedTableData [sezione] == .count 0 { ritorno CGFloat (0.0) } return CGFloat (40.0) } – DogCoffee

+0

0.01 ha funzionato per me, lol –

4

Questo sembra essere il modo corretto , Si animerà correttamente & funziona pulito ... come previsto per Apple ...

Fornire informazioni appropriate al delegato tableView

Quando ci sono articoli nel capitolo, ritorno 0.0f in:

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 

..Also ritorno pari a zero per:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

Do rimozione dei dati appropriata per tableView

  1. chiamate [tableView beginUpdates];
  2. rimuovere elementi dalla vostra dataSource, tenere traccia di dove elementi ricevuti rimossi ..
  3. chiamata deleteRowsAtIndexPaths con i indexPaths delle celle rimosse.
  4. se l'origine dati non contiene elementi (Qui si finirebbe solo con l'intestazione). Chiama reloadSections: per ricaricare quella sezione. Questo attiverà l'animazione corretta e nasconde/fa scorrere/svanisce l'intestazione.
  5. Infine chiamare [tableView endUpdates]; per terminare l'aggiornamento ..
7

nel 2015 utilizzando iOS 8 e xCode6, i seguenti ha lavorato per me.

/* Ritorna il titolo per ciascuna sezione se e solo se il numero di righe per ogni sezione non è 0. */

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 

    if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { 
     return nil; 
    }else{ 

    // here you want to return the title or whatever string you want to return for the section you want to display 

    return (SomeObject*)someobjectArray[section].title; 
    } 
} 
Problemi correlati