Как разрешить предупреждение: Отправка 'ViewController * const __strong' в параметр несовместимого типа 'id <AVAudioPlayerDelegate>?
Следующий код дал предупреждение Sending 'ViewController *const __strong' to parameter of incompatible type 'id<AVAudioPlayerDelegate>'
(это третья строка в следующем коде):
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];
Как это можно исправить? У меня этот код в методе ViewController
экземпляра viewDidLoad
. Был еще один вопрос, похожий, но это был метод класса: Несовместимые типы указателей, назначающие 'id <AVAudioPlayerDelegate> ' от "Класс"
Ответы
Ответ 1
Соответствуйте протоколу AVAudioPlayerDelegate
в вашем файле заголовка, и предупреждение исчезнет. Не объявляя, что класс соответствует данному протоколу, компилятор не может гарантировать (ну, по крайней мере, предупреждение) о том, что вы не выполнили требуемые ему методы. Следующий код - исправленная версия, которая будет подавлять предупреждение.
@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end
Ответ 2
Интересно, что этого не делал для меня. У меня есть делегат, определенный в файле заголовка - работая с UIImagePickerControllerDelegate в UITableViewController. Поскольку метод setDelegate ожидал идентификатор, я устанавливаю делегат следующим образом:
[myImagePicker setDelegate: (id)self];
Но я хотел бы знать, что происходит здесь? Поскольку это обычно не отображается в других примерах делегатов в других областях кода. Может ли кто-нибудь объяснить это?
Спасибо
Ответ 3
Ваше "я" (ваш класс) не имеет
@interface MyClassName: NSObject <AVAudioPlayerDelegate>
в файле заголовка.
Ответ 4
Это предупреждение о том, что вы пропустили определение своего делегата в файле .h
@interface ClassName : NSObject <YourDelegate>
Ответ 5
Убедитесь, что вы добавили делегат внутри скобок UIComponent
Например:
@interface DemoView: UIView <UITableViewDelegate>
а не делегировать свойство, которое вы создаете.
@property (сохранить) id <UITableViewDelegate> demoDelegate