La mise en œuvre de Modèle de Délégué en Objective-C
Je suis la construction d'une classe qui gère NSURLConnection demandes. Pour permettre à d'autres classes de l'utilisation de cette classe, je voudrais permettre à la classe principale à l'appel d'un délégué lorsque connectionDidFinishLoading est déclenché.
J'ai regardé par beaucoup de documentation, mais je ne peux pas trouver quelque chose qui donne des exemples clairs, et le code que j'ai à ne pas faire appel au délégué pour une raison quelconque. Le code que j'ai pour l'instant est (code non pertinentes supprimé):
Interface:
@interface PDUrlHandler : NSObject {
id delegate;
}
- (void)searchForItemNamed:(NSString *)searchQuery;
@property (nonatomic, assign) id delegate;
@end
@interface NSObject (PDUrlHandlerDelegate)
- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
@end
Mise en œuvre:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Fininshed Loading...");
resultData = [self parseJSON:jsonData];
if(delegate && [delegate respondsToSelector:@selector(urlHandler:searchResultsFinishedLoading:)]) {
NSLog(@"Delegating!");
[delegate urlHandler:self searchResultsFinishedLoading:resultData];
} else {
NSLog(@"Not Delegating. I dont know why.");
}
}
Le délégué à l'intérieur de l'autre classe:
- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
{
NSLog(@"Delegating!!!!");
}
OriginalL'auteur pixel | 2009-01-18
Vous devez vous connecter pour publier un commentaire.
Ma première pensée a été que vous pourriez ne pas avoir mis le délégué, mais vous l'avez. Autre que cela, le code est correct. Ne peut pas voir quelque chose de mal. Avez-vous essayer de mettre un point d'arrêt sur l'endroit où vous vérifier si votre délégué répond à un sélecteur? Peut être que le délégué de la valeur n'a pas été retenue et est devenu nul. Assurez-vous que votre délégué n'est pas nul, et a le bon objet.
Également vous assurer que la connexion est asynchrone? Connexions synchrones ne vais pas appeler la connectionDidFinishLoading méthode
OriginalL'auteur lostInTransit
S'avère que j'ai oublié de le mettre le délégué:
besoin d'aller au bout de la ligne qui fait l'appel initial à la PDUrlHandler.
OriginalL'auteur pixel
Pour quiconque est intéressé à voir un exemple de cela le apple exemple d'application NSURLCache implémente un simple délégué autour d'un NSURLConnection dans NSURLCacheConnection.m
L'exemple d'application est disponible sur l'apple developer connection ici:
http://developer.apple.com/iphone/library/samplecode/URLCache/index.html
Je l'ai trouvé assez utile.
OriginalL'auteur paulthenerd
Vous êtes sur la bonne voie, la façon dont vous êtes à la mise en œuvre du modèle de délégué semble ok. La raison pour laquelle elle n'est pas appelée est parce que vous êtes à l'aide de la fausse signature de la méthode dans respondsToSelector; vous avez
humidorServer:searchResultsFinishedLoading:
lorsque vous voulez vraimenturlHandler:searchResultsFinishedLoading:
.OriginalL'auteur Marc Charbonneau
Pourrait-il être le point virgule à la fin du nom de la méthode dans la délégué (en bas, à l'exemple de code à l'extrême droite)? Si le délégué est fixée et l'-connectionDidFinishLoading: méthode est appelée, alors je ne peux pas voir quelque chose de mal
OriginalL'auteur Martin Pilkington
Depuis que vous avez marqués avec de "iphone", je suppose que vous travaillez sur une application iPhone et n'ont pas besoin de soutien OS X pré-10.5. En Objective-C 2.0, Apple vous suggère d'utiliser les protocoles officiels (à l'aide de @protocol) avec en option des méthodes à la place de l'informel protocoles. Voici le texte:
(source)
OriginalL'auteur Martin Gordon