2009-10-19 14 views
14

Sto provando a modificare il titolo dell'intestazione per una sezione in un UITableView quando viene selezionata una cella da quella sezione. tableView:titleForHeaderInSection viene attivato dall'applicazione, quindi non aiuta. Posso chiamare reloadData, ma la performance ne risente perché l'app deve ricaricare tutte le celle visibili. Ho anche provato a utilizzare un'intestazione personalizzata, ma ciò comporta anche alcuni problemi di prestazioni.Modifica intestazione della sezione UITableView senza tableView: titleForHeaderInSection

C'è un modo per ottenere un handle per il UILabel che la visualizzazione di intestazione predefinita utilizza e modificare il testo manualmente?

Grazie!

risposta

14

Non sembra esserci alcuna API standard per accedere alla vista dell'intestazione di sezione fornita dal sistema. Hai provato il più mirato reloadSections:withRowAnimation per far visualizzare a UIKit il nuovo testo dell'intestazione?

Che tipo di problemi di prestazioni hai riscontrato con le visualizzazioni di intestazione di sezione personalizzate? Dubito che quello standard sia molto più di un semplice UILabel.

+0

Sembra che potrei dover utilizzare le reloadSections, anche se è quasi lento come ricaricare l'intera tabella (almeno per la mia app). Sono stato sventato in ogni momento dalla API Cocoa. Ho provato a utilizzare una coda circolare per riutilizzare un set di UILabel e restituirli in viewForHeader, ma viewForHeader viene chiamato per così tante celle (anche quelle che non sono visibili!), Che avevo bisogno di creare un UILabel separato per ogni cella, che è semplicemente brutto. Argh! –

0

Questo è un WAG e posso pensare a molti motivi per cui potrebbe non funzionare, ma non è possibile scorrere le sottoview e trovare quello che si sta cercando? Per esempio.

for (UIView *v in self.tableView.subviews) { 
    // ... is this the one? 
} 
1

Dal momento che un UITableView non accodamento e dequeue vista sezione di intestazione per il riutilizzo, si potrebbe anche vedere se è fattibile per memorizzare tutti i punti di vista sezione di intestazione in memoria. Nota che dovrai creare le tue viste di intestazione di sezione con lo sfondo e così via, per farlo, ma ti consente un po 'più di flessibilità e capacità.

Si potrebbe anche provare a taggare le viste dell'intestazione di sezione (richiede anche di creare le proprie viste di intestazione di sezione) e semplicemente afferrarle dalla tabella come necessario.

24

La chiamata di [tableView endUpdates] può fornire i risultati desiderati senza troppi problemi di prestazioni.

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

// forces the tableView to ask its delegate/datasource the following: 
// numberOfSectionsInTableView: 
// tableView:titleForHeaderInSection: 
// tableView:titleForFooterInSection: 
// tableView:viewForHeaderInSection: 
// tableView:viewForFooterInSection: 
// tableView:heightForHeaderInSection: 
// tableView:heightForFooterInSection: 
// tableView:numberOfRowsInSection: 
+1

In iOS10/11 (swift) ho notato 'tableView: viewForHeaderInSection:' e 'tableView: viewForFooterInSection:' non vengono chiamati quindi è necessario modificare la vista da soli –

13

con:

[self.tableView headerViewForSection:i] 

si potrebbe ottenere la vista per sezione I e poi "update" manualmente

questo funziona anche se il vostro vista è semplicemente l'etichetta auto-generata, ma dovrai ridimensionarlo da solo. quindi se si tenta di:

[self.tableView headerViewForSection:i].textLabel.text = [self tableView:self.tableView titleForHeaderInSection:i]; 

si imposterà il testo, ma non si impostare l'etichetta-size. È possibile ottenere la dimensione necessaria da NSString per impostare da soli:

[label.text sizeWithFont:label.font]; 
+0

Hackish e non consigliabile, ma questo fa esattamente ciò che era necessario nella domanda originale. Quindi +1. – bioffe

+2

[self.tableView headerViewForSection: i] sempre dando un valore nullo –

+0

Immagino che otterrete nulla se non si dispone di un'intestazione (cioè celle statiche create nello storyboard e nessun testo il campo "Intestazione" di ogni sezione). –

0

Una delle soluzioni potrebbe essere quella di gestire array esterno per molteplici intestazioni di sezione contenente i riferimenti di etichetta e aggiornarli esternamente.

3

È possibile impostare direttamente il titolo per l'etichetta dell'intestazione di sezione. Ad esempio, per impostare il titolo della sezione a zero:

UITableViewHeaderFooterView *sectionZeroHeader = [self.tableView headerViewForSection:0]; 
NSString *sectionZeroLabel = @"Section Zero"; 
[sectionZeroHeader.textLabel setText:[sectionZeroLabel uppercaseString]]; 
[sectionZeroHeader setNeedsLayout]; 

essere sicuri e dire la sezione di intestazione vista ha bisogno di layout, altrimenti il ​​nuovo testo potrebbe essere troncato. Inoltre, le etichette di sezione sono in genere tutte maiuscole.

+0

Questo non sembra funzionare se si utilizza l'altezza automatica. – lostintranslation

Problemi correlati