Avertissement lors de l'ajout et de l'utilisation d'une nouvelle méthode dans un protocole de bibliothèque externe

J'utilise une bibliothèque externe et un de mes controllers de vue enregistre en tant que délégué pour une class dans ce cadre. Maintenant, à un endroit, je veux exécuter du code sur cette class de délégué. J'écris une méthode pour cela et l'appelle sur mon délégué.

Maintenant, tout fonctionne bien, mais je reçois un avertissement que cette méthode nouvellement ajoutée ne fait pas partie du protocole.

C'est ma class:

@protocol MyExtendedDelegate <LibraryDelegate> @optional - (void)actionTaken; @end @interface MyController : UITableController <MyExtendedDelegate> { } @end 

Et à l'intérieur de mon controller, je m'inscris en tant que délégué pour le controller de la bibliothèque

 LibraryController *libController = [[LibraryController alloc] init]; libController.delegate = self; 

Enfin, c'est le code dans une class séparée où j'appelle cette méthode:

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if ([self.libraryController.delegate respondsToSelector:@selector(actionTaken)]) { [self.libraryController.delegate actionTaken]; } 

Voici l'avertissement que je reçois:

– actionTaken introuvable dans le protocole
– NSObject peut ne pas répondre à actionTaken

Je veux me débarrasser de cet avertissement. Une idée.

La propriété libraryController.delegate est définie dans la bibliothèque externe pour se conformer à LibraryDelegate . Essayez de MyExtendedDelegate à MyExtendedDelegate avant d'appeler la méthode de votre protocole étendu.

 if ([self.libraryController.delegate conformsToProtocol:@protocol(MyExtendedDelegate)]) { id<MyExtendedDelegate> extendedDelegate = (id<MyExtendedDelegate>)self.libraryController.delegate; if ([extendedDelegate respondsToSelector:@selector(actionTaken)]) { [extendedDelegate actionTaken]; } } 

Ecrire un nouveau protocole qui prolonge l'ancien, et se conformer à cela, quelque chose comme:

 @protocol MyNewProtocol <OtherProtocol> - (void) myCoolMethod; @end 
  • (vide) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex {if ([self.libraryController.delegate répondsToSelector: @selecteur (actionTaken)]) {[self.libraryController.delegate performSelector: @selecteur (actionTaken)]; }

Utiliser performSelector au lieu d'appeler directement une méthode supprimera l'avertissement à coup sûr.