以下代码警告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
的{{1}}实例方法中使用了此代码。还有一个类似的问题,但这是一个类方法:Incompatible pointer types assigning to 'id<AVAudioPlayerDelegate>' from 'Class'
答案 0 :(得分:77)
符合头文件中的AVAudioPlayerDelegate
协议,警告将消失。通过不声明类符合给定的协议,编译器无法保证(至少警告)您未能实现它所需的方法。以下代码是一个将禁止警告的更正版本。
@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end
答案 1 :(得分:31)
有趣的是,我没有这样做。我在头文件中定义了委托 - 在 UITableViewController 中使用 UIImagePickerControllerDelegate 。由于setDelegate方法需要一个id,我将代理设置如下:
[myImagePicker setDelegate: (id)self];
但我想知道这里发生了什么?因为这通常不会出现在其他代码区域的其他委托示例中。有谁可以澄清这个?
谢谢
答案 2 :(得分:4)
你的自己(你的班级)没有
@interface MyClassName: NSObject <AVAudioPlayerDelegate>
在头文件中。
答案 3 :(得分:2)
这是一个警告,告诉您错过了在.h文件中定义代理
@interface ClassName : NSObject <YourDelegate>
答案 4 :(得分:0)
确保在UIComponent大括号中添加委托
例如: @interface DemoView:UIView&lt;的UITableViewDelegate&GT;
而不是委托你正在创建的属性。
@property(retain)id&lt;的UITableViewDelegate&GT; demoDelegate