2014-05-06 28 views
11

Mein UITableView hat benutzerdefinierte UIView-Header in jedem Abschnitt. Ich muss nur die Header und nicht den anderen Inhalt in dem Abschnitt aktualisieren. Ich habe [self.tableView headerViewForSection:i] ausprobiert und es gibt nichts zurück, obwohl es sollte. Kann ich das überhaupt machen?Aktualisieren Sie nur die benutzerdefinierten Header-Ansichten in einem UITableView?

bearbeiten: Code auf Basis neuen Vorschlag

ich auch diesen einen Schuss gegeben habe und es ruft/aktualisiert die UIView innerhalb dieser Methode, aber die Änderungen visuell nicht auf den Schirm ausbreiten.

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

Verwenden Sie eine Nib, um Ihre Header zu laden, oder erstellen Sie sie programmgesteuert in 'tableView: viewForHeaderInSection:'? – Stonz2

+0

Ich erstelle sie programmatisch in der angegebenen Methode. – Jonathan

Antwort

12

Anstatt setNeedsDisplay aufzurufen, konfigurieren Sie die Kopfzeile selbst, indem Sie ihre Eigenschaften festlegen. Und natürlich müssen Sie die tatsächlichen Header in der Tabelle abrufen, rufen Sie die Delegate-Methode nicht auf, da diese Methode normalerweise eine neue Header-Ansicht erstellt.

Normalerweise mache ich dies in einer kleinen Hilfsmethode, die auch von tableView:viewForHeaderInSection: aufgerufen wird.

z.B .:

- (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

All dies funktioniert gut, aber der Aufruf für 'UITableViewHeaderFooterView * header = [self.tableView headerViewForSection: i]; 'gibt nichts zurück. Ich habe versucht, '[self tableView: self.tableView viewForHeaderInSection: i]' zu machen, und es gibt eine Kopfzeile zurück und bringt mich zur Konfiguration, zeigt aber immer noch nicht die Änderungen auf dem Bildschirm an. – Jonathan

+2

wenn '[self.tableView headerViewForSection: i] 'gibt nil zurück, dann hat Ihr tableView keinen Header für diesen Abschnitt oder ist derzeit nicht sichtbar. Und natürlich wird [self tableView: self.tableView viewForHeaderInSection: i] 'eine Ansicht zurückgeben, aber diese Ansicht wird neu erstellt und ist nicht Teil der View-Hierarchie; Sie können diese Ansicht nicht sehen. –

+0

Was kann ich tun, um dies zu überprüfen? Visuell hat die Tabellenansicht Header für jeden Abschnitt und sie werden genau wie oben beschrieben instanziiert. – Jonathan

0

Erstellen Sie Ihre eigene Unterklasse von UIView für die headerView und fügen Sie ihr einige Methoden hinzu, damit der View-Controller die gewünschten UI-Aktualisierungen senden kann.

0

Wenn Sie Ihre benutzerdefinierten Header Ansichten zu erstellen, verwenden UITableViewHeaderFooterView anstelle einer einfachen UIView und wenn Sie es initialisieren, verwenden Sie so etwas wie dieses:

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

Die reuseIdentifier wird zeigen, Ihre UITableView Spur des Headers zu halten und es sollte nicht mehr null zurück, wenn Sie versuchen, darauf zuzugreifen mit [self.tableView headerViewForSection:i]

Sie sollten dann in der Lage sein setNeedsDisplay zu verwenden, um auf die UITableViewHeaderFooterView Sie zurück von headerViewForSection nach den Änderungen.

0

Aufruf setNeedsDisplay dient nur zum Auslösen der drawRect: Methode der Empfangsansicht. Wenn sich Ihre Textfarbenlogik nicht hier befindet (dh in der drawRect-Methode Ihrer UIView-Unterklasse, die Sie für Header-Ansichten verwenden), ändert sich wahrscheinlich nichts. Sie müssen direkt etwas in den Kopfzeilenansichten aufrufen, um ihren Status basierend auf Ihren neuen oder geänderten Daten zu aktualisieren, oder direkt auf die Beschriftung in der Kopfzeile zugreifen und diese während der Iteration selbst ändern. setNeedsDisplay wird nur Code in der drawRect: Methode der Ansicht ausgelöst.

0

Vor kurzem hatte ich genau dieses Problem und überwand sie nur durch einen Zeiger auf die Header zu halten, wie sie erstellt wurden. Ich machte es in Swift und mit einem schnellen Wörterbuchtyp, aber die Idee konnte irgendwie in objC einmassiert werden.

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 
    } 
Verwandte Themen