web-dev-qa-db-ja.com

警告の解決方法:「ViewController * const __strong」を互換性のないタイプ「id <AVAudioPlayerDelegate>」のパラメーターに送信しますか?

次のコードは、Sending 'ViewController *const __strong' to parameter of incompatible type 'id<AVAudioPlayerDelegate>'の警告を出しました(次のコードの3行目です):

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];

どうすれば修正できますか?このコードは、ViewControllerviewDidLoadのインスタンスメソッドにあります。同様の別の質問がありましたが、それはクラスメソッドでした: 「Class」から「id <AVAudioPlayerDelegate>」に割り当てる互換性のないポインタ型

35
Jeremy L

ヘッダーファイルのAVAudioPlayerDelegateプロトコルに準拠すると、警告は表示されなくなります。クラスが特定のプロトコルに準拠していることを宣言しないと、コンパイラは、必要なメソッドを実装できないことを保証できません(少なくとも警告を発します)。次のコードは、警告を抑制する修正バージョンです。

@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end
77
CodaFi

興味深いことに、それは私のためにそれをしませんでした。ヘッダーファイルにデリゲートが定義されています-IImagePickerControllerDelegate in ITableViewControllerで作業しています。 setDelegateメソッドはIDを予期しているため、代わりにデリゲートを次のように設定します。

[myImagePicker setDelegate: (id)self];

しかし、私はここで何が起こっているのか知りたいですか?これは通常、コードの他の領域の他のデリゲートの例には現れません。誰もこれを解明できますか?

ありがとう

31
Rajive Jain

あなたの自己(あなたのクラス)には

@interface MyClassName: NSObject <AVAudioPlayerDelegate>

ヘッダーファイル内。

4
Pochi

これは、.hファイルでデリゲートを定義するのを忘れていることを伝える警告です

@interface ClassName : NSObject <YourDelegate>
2
Kirit Vaghela

UIComponentブレース内にデリゲートを追加してください

例:@interface DemoView:UIView <UITableViewDelegate>

作成しているプロパティを委任するのではなく。

@property(retain)id <UITableViewDelegate> demoDelegate

0