Подтвердить что ты не робот

Как разрешить предупреждение: Отправка '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> ' от "Класс"

4b9b3361

Ответ 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