web-dev-qa-db-fra.com

Comment résoudre l'avertissement: Envoi de 'ViewController * const __strong' au paramètre de type incompatible 'id <AVAudioPlayerDelegate>?

Le code suivant a donné un avertissement de Sending 'ViewController *const __strong' to parameter of incompatible type 'id<AVAudioPlayerDelegate>' (c'est la troisième ligne du code suivant):

NSURL *sound0URL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"0" ofType:@"aiff"]];

audioPlayer0 = [[AVAudioPlayer alloc] initWithContentsOfURL:sound0URL error:nil];

[audioPlayer0 setDelegate: self];   // <---   this line causes the warning
[audioPlayer0 prepareToPlay];

audioPlayer0.currentTime = 0;
[audioPlayer0 play];

Comment peut-il être corrigé? J'ai ce code dans la méthode d'instance de ViewController de viewDidLoad. Il y avait une autre question similaire mais c'était une méthode de classe: Types de pointeurs incompatibles affectant à 'id <AVAudioPlayerDelegate>' de 'Class'

35
Jeremy L

Conformez-vous au protocole AVAudioPlayerDelegate dans votre fichier d'en-tête et l'avertissement disparaîtra. En ne déclarant pas qu'une classe est conforme à un protocole donné, le compilateur ne peut pas garantir (enfin, au moins avertir) de votre incapacité à implémenter les méthodes requises. Le code suivant est une version corrigée qui supprimera l'avertissement.

@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end
77
CodaFi

Fait intéressant, cela ne l'a pas fait pour moi. J'ai le délégué défini dans le fichier d'en-tête - travaillant avec IImagePickerControllerDelegate dans un ITableViewController. Étant donné que la méthode setDelegate attendait un identifiant, j'ai plutôt défini délégué comme suit:

[myImagePicker setDelegate: (id)self];

Mais je voudrais savoir ce qui se passe ici? Puisque cela ne se montre normalement pas dans d'autres exemples de délégués dans d'autres domaines du code. Quelqu'un pourrait-il élucider cela?

Merci

31
Rajive Jain

Votre auto (votre classe) n'a pas le

@interface MyClassName: NSObject <AVAudioPlayerDelegate>

dans le fichier d'en-tête.

4
Pochi

Il s'agit d'un avertissement vous informant que vous n'avez pas réussi à définir votre délégué dans le fichier .h

@interface ClassName : NSObject <YourDelegate>
2
Kirit Vaghela

Assurez-vous d'ajouter un délégué à l'intérieur des accolades UIComponent

Par exemple: @interface DemoView: UIView <UITableViewDelegate>

plutôt que de déléguer la propriété que vous créez.

@property (retenue) id <UITableViewDelegate> demoDelegate

0
sourabh sharotria