2012-04-30 38 views
33

下面的代碼給了Sending 'ViewController *const __strong' to parameter of incompatible type 'id<AVAudioPlayerDelegate>'(這是在下面的代碼的第三行)警告:如何解決警告:將'ViewController * const __strong'發送到不兼容類型'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中有此代碼。有另一個類似的問題,但這是一個類的方法:Incompatible pointer types assigning to 'id<AVAudioPlayerDelegate>' from 'Class'

回答

72

符合您的頭文件中的AVAudioPlayerDelegate協議,警告將消失。通過不聲明一個類符合給定的協議,編譯器不能保證(至少是警告)你沒有實現所需的方法。以下代碼是一個可以抑制警告的更正版本。

@interface ViewController : UIViewController <AVAudioPlayerDelegate> 
@end 
4

你的自我(類)犯規有

@interface MyClassName: NSObject <AVAudioPlayerDelegate> 
在頭文件

2

此警告告訴你,你錯過了.h文件中

@interface ClassName : NSObject <YourDeletegate> 
29

有趣的是這並沒有爲我做它來定義你的委託。我有在頭文件中定義的委託 - 與UIImagePickerControllerDelegateUITableViewController。由於setDelegate方法預期的ID,我將委託作爲代替如下:

[myImagePicker setDelegate: (id)self]; 

但我想知道這裏發生了什麼?由於這通常不在其他代碼示例中顯示在其他代碼區域中。任何人都可以澄清這一點?

感謝

+1

同樣在這裏 - 我.h文件中已定義的委託,但警告仍然存在 – barry

+0

也許你有你的控制器定義的UIViewController或UITableViewController中(例如)和你的myImagePicker是一個UINavigationController ...可能會導致警告。 –

+0

[myImagePicker setDelegate:(id )self]; –

0

確保您添加委託內部UIComponent括號

如: @interface DemoView:UIView的<的UITableViewDelegate>

,而不是要創建委託財產。

@property(保留)ID <的UITableViewDelegate> demoDelegate

相關問題