2009-08-27 5 views
3

J'implémente une méthode déléguée optionnelle sur l'API Cocoa Touch. Ce que je voudrais faire est, d'abord appeler la méthode que aurait été appelée si je n'ai pas mis en œuvre le délégué ... puis apporter des modifications au résultat ... puis renvoyer ma version modifiée.Comment appeler la méthode qui aurait été appelée si le délégué n'était pas là

Voici un exemple:

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

La ligne marquée ne fonctionne pas. Je pourrais mettre unObjet = tableView.delegate, mais cela me donne juste une récursion infinie. Y a-t-il un truc pour faire de la tableView ce qu'elle ferait si la méthode optionnelle n'était pas implémentée? Je ne suis pas super optimiste, mais ce serait cool si possible.

Répondre

6

Il n'y a pas de méthode qui aurait été appelé si vous didn n'implémentez pas le délégué. Les délégués ne sont pas comme des sous-classes; ils ne sont pas une caractéristique de la langue. UITableView (dans ce cas), fait un peu de travail, cherche à voir si sa propriété -delegate est non-nulle (qui est juste un ivar aléatoire qui se trouve être appelé "delegate"), si c'est le cas, le délégué implémente le délégué méthode, l'appelle si elle le fait, puis fait un peu plus de travail. UITableView n'expose pas une vue d'en-tête de section par défaut (c'est une sous-classe privée appelée UISectionHeaderCell je crois), donc Apple ne fait aucune promesse sur la façon dont elle est implémentée. ou nous donner un bon moyen de nous en emparer Il y a plusieurs façons d'accéder à la vue en question, mais Apple ne nous a pas encore donné un moyen soutenu que je connaisse. Mais à la question générale sur les délégués, ce que vous demandez n'existe pas parce que ce n'est pas la façon dont les délégués sont mis en œuvre.

2

Je devine UITableView fait quelque chose comme ceci:

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

Je ne pense pas qu'il serait possible pour vous d'obtenir le l'original, de cette façon.

3

Vérifiez la documentation sur respondsToSelector - il vous donne la possibilité de tester et de voir si un objet est, bien, répondre au sélecteur :)

Questions connexes