2014-05-06 12 views
11

Il mio UITableView ha intestazioni Uiview personalizzate in ogni sezione. Ho bisogno di aggiornare solo le intestazioni e non l'altro contenuto nella sezione. Ho provato [self.tableView headerViewForSection:i] e non restituisce nulla anche se dovrebbe. C'è comunque che io possa farlo?Aggiorna solo le visualizzazioni di intestazione personalizzate in un UITableView?

Edit: Codice basa su nuovo suggerimento

ho dato a questo un colpo così e chiama/aggiorna l'UIView all'interno di tale metodo, ma i cambiamenti non si propagano visivamente sullo schermo.

for (int i = 0; i < self.objects.count; i++) { 
    UIView *headerView = [self tableView:self.tableView viewForHeaderInSection:i]; 
    [headerView setNeedsDisplay]; 
} 
+0

Stai usando un pennino per caricare le intestazioni, o sei crearli programmazione in 'tableView: viewForHeaderInSection:'? – Stonz2

+0

Le sto creando programmaticamente nel metodo indicato. – Jonathan

risposta

12

Invece di chiamare setNeedsDisplay, configurare personalmente l'intestazione impostando le sue proprietà. E ovviamente è necessario ottenere le intestazioni effettive nella tabella, non chiamare il metodo delegate, poiché in genere tale metodo crea una nuova vista di intestazione.

Io di solito lo faccio in un piccolo metodo di supporto che viene chiamato da tableView:viewForHeaderInSection: pure.

es .:

- (void)configureHeader:(UITableViewHeaderFooterView *)header forSection:(NSInteger)section { 
    // configure your header 
    header.textLabel.text = ... 
} 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UITableViewHeaderFooterView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Header"]; 
    [self configureHeader:header forSection:section]; 
} 

- (void)reloadHeaders { 
    for (NSInteger i = 0; i < [self numberOfSectionsInTableView:self.tableView]; i++) { 
     UITableViewHeaderFooterView *header = [self.tableView headerViewForSection:i]; 
     [self configureHeader:header forSection:i]; 
    } 
} 
+1

Tutto questo funziona alla grande, ma la chiamata per 'UITableViewHeaderFooterView * header = [self.tableView headerViewForSection: i];' non restituisce nulla. Ho provato a fare '[self tableView: self.tableView viewForHeaderInSection: i]' e restituisce un'intestazione e mi porta a configurare, ma non visualizza le modifiche visivamente sullo schermo. – Jonathan

+2

se '[auto.tableView headerViewForSection: i] 'restituisce nil, quindi tableView non ha un'intestazione per questa sezione, o al momento non è visibile. E ovviamente '[self tableView: self.tableView viewForHeaderInSection: i]' restituirà una vista, ma questa vista è stata appena creata e non fa parte della gerarchia della vista; non puoi vedere quella vista. –

+0

Cosa posso fare per controllare questo? Visivamente la vista tabella ha intestazioni per ogni sezione e vengono istanziate esattamente come hai scritto sopra. – Jonathan

0

Crea il tuo sottoclasse di UIView per il headerView, e aggiungere un paio di metodi ad esso in modo che il controller della vista può inviare qualunque aggiornamenti dell'interfaccia utente che si desidera esso.

0

Quando si creano le viste di intestazione personalizzato, utilizzare UITableViewHeaderFooterView al posto di un semplice UIView e quando si inizializza, utilizzare qualcosa di simile:

UITableViewHeaderFooterView *cell = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:@"reuseIdentifier"]; 

Il reuseIdentifier vi dirà il vostro UITableView per tenere traccia di intestazione e essa non deve più tornare null quando si tenta di accedere con [self.tableView headerViewForSection:i]

si dovrebbe quindi essere in grado di utilizzare setNeedsDisplay sul UITableViewHeaderFooterView si torna da headerViewForSection dopo aver apportato le modifiche.

0

La chiamata setNeedsDisplay serve solo per attivare il metodo drawRect: della vista di ricezione. A meno che non si tratti della logica del colore del testo (vale a dire, nel metodo drawRect della sottoclasse UIView che si sta utilizzando per le visualizzazioni dell'intestazione), non è probabile che nulla cambi. Quello che devi fare è chiamare direttamente qualcosa nelle viste dell'intestazione per aggiornare il loro stato in base ai dati nuovi o modificati o accedere direttamente all'etichetta nella vista dell'intestazione e modificarlo da solo mentre si scorre attraverso di essi. setNeedsDisplay attiva solo il codice trovato nel metodo drawRect: della vista.

0

Recentemente ho avuto questo problema esatto e solo superato esso mantenendo un puntatore ai intestazioni come sono stati creati. L'ho fatto in Swift e con un solo tipo di dizionario veloce, ma l'idea potrebbe essere massaggiata in objC in qualche modo.

var headers : [ Int : UIView ] = [ : ] //dictionary for keeping pointer to headers 

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

     if let h = super.tableView(tableView , viewForHeaderInSection: section) { //or create your view (this viewController inherits it).. 
     self.headers.updateValue(h , forKey: section) //keep a pointer to it before you return it.. 
     return h 
     } 
     return nil 
    } 
Problemi correlati