2012-08-08 5 views
2

Dès ma première vue charge mon contrôleur de localisation appelle -(void)locationFound à son délégué, qui est [UIApplication sharedApplication].delegate (mon AppDelegate) J'ai un protocole correspondant qui demande juste pour cette méthode un nécessaire locationFound.protocole Ajouté à ne pas enregistrer AppDelegate

J'ai une adhésion de protocole déclaré comme tant dans mon en-tête AppDelegate:

@interface ProgramAppDelegate : UIResponder <UIApplicationDelegate, LocationFoundProtocol> 

Tout fonctionne très bien - - sauf que je reçois un avertissement lorsque j'attribue le délégué dans mon contrôleur de l'emplacement - comme ceci:

self.positioningBrain.positioningNetworkingDelegate = [UIApplication sharedApplication].delegate; 

il me dit:

Assigning to 'id<LocationFoundProtocol>' from incompatible type 'id<UIApplicationDelegate>' 

il semble que ce ne voit tout simplement pas e à mon AppDelegate est en fait conforme à mon protocole spécifié - même si elle est déclarée dans l'en-tête.

Y at-il une raison pour laquelle XCode enregistre cette différence? Je ne suis pas trop surpris que mon code fonctionne, car les protocoles devraient tous être sémantiques de toute façon, mais s'il y a une meilleure façon de le faire, j'aimerais savoir.

+0

juste faire certains - avez-vous « ' #import « ProgramAppDelegate.h » ' » en haut de chaque fois que vous essayez de faire cette mission? –

+0

Vous devez lancer '[UIApplication sharedApplication] .delegate', http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/ TP40006728-CH3-SW24 – Vervious

Répondre

3

la propriété délégué de UIApplication renvoie le type suivant

id<UIApplicationDelegate> 

Vous devez effectuer un cast du type retourné à votre AppDelegates de type

... = (MyAppDelegate*)[UIApplication sharedApplication].delegate 
+0

self.positioningBrain.positioningNetworkingDelegate = (ProgramAppDelegate *) [UIApplication sharedApplication] .delegate; ne fonctionne pas - pour une raison quelconque, il m'indique qu'il ne peut pas trouver ProgramAppDelegate * - même si c'est la classe dans laquelle je travaille. Utilisation de l'identificateur non déclaré 'LocalChatAppDelegate' Expression attendue Manquant '[' au début du message send expression Attendu ']' –

+0

Ugh comment frappez-vous entrer? –

+0

dans un commentaire? shift - entrez –

1

Le problème est que le compilateur ne sait pas que [UIApplication sharedApplication].delegate est de type ProgramAppDelegate; Tout ce qu'il sait, c'est que la méthode déléguée de UIApplication renvoie id<UIApplicationDelegate>. Si vous souhaitez supprimer l'avertissement, vous devez affecter positioningNetworkingDelegate depuis un endroit où vous connaissez le type complet du délégué de l'application. (Par exemple, si vous étiez dans le propre code du délégué, vous pourriez juste dire positioningBrain.positioningNetworkingDelegate = self et cela fonctionnerait).

Vous pouvez également jeter pour convaincre le compilateur ceci est valable:

self.positioningBrain.positioningNetworkingDelegate = (ProgramAppDelegate *)[UIApplication sharedApplication].delegate; 

Beaucoup de gens font fonction de raccourci ou macro à cet effet. Quelque chose comme:

#define APPDEL ((ProgramAppDelegate *)[UIApplication sharedApplication].delegate) 
Questions connexes