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'
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
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
Votre auto (votre classe) n'a pas le
@interface MyClassName: NSObject <AVAudioPlayerDelegate>
dans le fichier d'en-tête.
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>
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