2009-08-27 11 views
3

Ich implementiere eine optionale Delegate-Methode für die Cocoa Touch-API. Was ich möchte, ist, zuerst die Methode aufrufen, die würde aufgerufen wurden, wenn ich nicht den Delegaten implementieren ... dann Änderungen am Ergebnis vornehmen ... dann zurückgegeben meine modifizierte Version.So rufen Sie die Methode auf, die aufgerufen würde, wenn der Delegat nicht vorhanden wäre

Hier ist ein Beispiel:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; { 
    /* this line: */ UIView * headerView = [someObject tableView:tableView viewForHeaderInSection:section]; 
    [headerView setBackgroundColor:[UIColor redColor]]; 
    return headerView; 
} 

Die markierte Zeile funktioniert nicht. Ich könnte etwasObject = tableView.delegate setzen, aber das gibt mir nur unendliche Rekursion. Gibt es einen Trick, um die TableView zu machen, was auch immer passieren würde, wenn die optionale Methode nicht implementiert wäre? Ich bin nicht sehr hoffnungsvoll, aber es wäre cool wenn möglich.

Antwort

6

Es gibt keine Methode, die aufgerufen worden wäre, wenn Sie didn Implementiere den Delegierten nicht. Delegaten sind nicht wie Unterklassen; Sie sind keine Sprachfunktion. Die UITableView (in diesem Fall), tut etwas Arbeit, schaut, um zu sehen, ob seine -Delegate-Eigenschaft ist nicht-Null (das ist nur ein zufälliger ivar, der zufällig "Delegate" genannt wird), wenn so sieht der Delegat implementiert den Delegaten Methode, ruft es, wenn es tut, dann tut etwas mehr Arbeit.

UITableView stellt keine Standard-Abschnitts-Header-Ansicht zur Verfügung (es handelt sich um eine private Unterklasse mit dem Namen UISectionHeaderCell, glaube ich), daher macht Apple keine Versprechen, wie es implementiert wird. oder geben uns einen guten Weg, um es zu erhalten Es gibt mehrere Möglichkeiten, um zu der fraglichen Ansicht zu gelangen, aber Apple hat uns noch keinen unterstützten Weg gegeben, von dem ich weiß.

Aber zu der allgemeinen Frage nach Delegaten, was Sie fragen, existiert nicht, weil Delegierte nicht implementiert sind.

2

Ich vermute, UITableView tut etwas wie folgt aus:

if ([delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) { 
    [delegate tableView:self viewForHeaderInSection:section]; 
} else { 
    // Does its own thing instead 
} 

Ich denke also nicht, dass es möglich wäre, für Sie das Original zu erhalten, auf diese Weise.

3

Schauen Sie sich die Dokumentation auf respondsToSelector - es gibt Ihnen die Möglichkeit zu testen und zu sehen, ob ein Objekt, na ja, an den Wähler reagieren :)

Verwandte Themen