Étape 1 :
Dans votre fichier App Delegate .h, vous devez déclarer un protocole comme suit :
@protocol AppConnectionDelegate <NSObject>
@required
-(void)connectionFinished:(NSObject*)outObject;
@end
Dans le même fichier, ajoutez un ivar comme suit :
id *delegate;
Déclarer l'ivar comme une propriété :
@property (nonatomic, assign) id<AppConnectionDelegate> delegate;
Dans le fichier .m de l'App Delegate, synthétiser l'ivar :
@synthesize delegate;
Dans le fichier .m de l'App Delegate, sur connectionDidFinishLoading faire :
if([self.delegate respondsToSelector:@selector(connectionFinished:)])
{
[self.delegate connectionFinished:objectYouWantToSend];
}
Dans le fichier .h de votre viewcontroller, mettez en œuvre le délégué AppConnectionDelegate en important une référence au fichier du délégué App :
#import "AppDelegate_iPhone.h" //if using iPhone
#import "AppDelegate_iPad.h" //if using iPad
Dans le même fichier, à la fin de la première ligne de la déclaration de l'interface, faites :
@interface AppDelegate_iPhone : AppDelegate_Shared <AppConnectionDelegate>
Déclarez les ivars en conséquence :
AppDelegate_iPhone *appDelegate; //if using iPhone
AppDelegate_iPad *appDelegate; // if using iPad
Dans le fichier .m de votre viewcontroller, dans le viewDidLoad(), obtenez une référence à votre délégué d'application en utilisant :
Si iPhone ;
appDelegate = (AppDelegate_iPhone*)[[UIApplication sharedApplication] delegate];
Si iPad :
appDelegate = (AppDelegate_iPad*)[[UIApplication sharedApplication] delegate];
Ensuite, définissez le viewcontroller pour être le délégué dans viewDidLoad() en faisant :
appDelegate.delegate = self;
Maintenant, vous devez simplement implémenter la méthode connectionFinished dans le fichier .m :
- (void)connectionFinished:(NSObject*)incomingObject
{
//Do whatever you want here when the connection is finished. IncomingObject is the object that the app delegate sent.
}
Maintenant, chaque fois que la connexionDidFinishLoading de votre délégué d'application est appelée, le contrôleur de vue sera notifié.
[Une bonne pratique consiste à définir appDelegate.delegate = nil si vous avez fini d'utiliser le callback connectionFinished].
Cela a fait ses preuves. Si vous avez des questions, laissez un commentaire.......
--EDIT--
Il s'agit d'une alternative robuste à la NSNotification. J'utilise les deux en fonction des besoins. Le processus que j'utilise pour décider entre l'utilisation de la NSNotification ou d'un rappel de délégué utilisant un protocole est simple :
Pour les notifications :
Un expéditeur, plusieurs auditeurs.
Aucune référence possible entre l'expéditeur et l'auditeur.
Les objets complexes/multiples ne doivent pas être envoyés
Pour les appels de délégués utilisant des protocoles :
Un expéditeur, un nombre limité (généralement 1) d'auditeurs.
Une référence entre l'expéditeur et l'auditeur est possible.
Des objets complexes/multiples doivent être envoyés (par exemple, des objets de réponse qui doivent être envoyés)
Je sais que l'envoi d'objets est possible par le biais de notifications, mais je préfère les protocoles pour cela.
--EDIT--