40

次のコードは警告を出しました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];

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

4

5 に答える 5

83

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

@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end
于 2012-04-30T02:04:33.790 に答える
33

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

[myImagePicker setDelegate: (id)self];

しかし、私はここで何が起こっているのか知りたいですか?これは通常、コードの他の領域の他のデリゲートの例では表示されないためです。誰かがこれについて解明できますか?

ありがとう

于 2013-09-17T16:14:35.843 に答える
5

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

@interface MyClassName: NSObject <AVAudioPlayerDelegate>

ヘッダーファイル内。

于 2012-04-30T02:06:01.527 に答える
4

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

@interface ClassName : NSObject <YourDelegate>
于 2013-04-29T05:54:26.990 に答える
0

UIComponent中括弧内にデリゲートを追加してください

例:@interface DemoView:UIView <UITableViewDelegate>

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

@property(retain)id <UITableViewDelegate> demoDelegate

于 2015-01-29T12:12:28.090 に答える