次のコードは、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
のインスタンスメソッドにあります。同様の別の質問がありましたが、それはクラスメソッドでした: 「Class」から「id <AVAudioPlayerDelegate>」に割り当てる互換性のないポインタ型
ヘッダーファイルのAVAudioPlayerDelegate
プロトコルに準拠すると、警告は表示されなくなります。クラスが特定のプロトコルに準拠していることを宣言しないと、コンパイラは、必要なメソッドを実装できないことを保証できません(少なくとも警告を発します)。次のコードは、警告を抑制する修正バージョンです。
@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end
興味深いことに、それは私のためにそれをしませんでした。ヘッダーファイルにデリゲートが定義されています-IImagePickerControllerDelegate in ITableViewControllerで作業しています。 setDelegateメソッドはIDを予期しているため、代わりにデリゲートを次のように設定します。
[myImagePicker setDelegate: (id)self];
しかし、私はここで何が起こっているのか知りたいですか?これは通常、コードの他の領域の他のデリゲートの例には現れません。誰もこれを解明できますか?
ありがとう
あなたの自己(あなたのクラス)には
@interface MyClassName: NSObject <AVAudioPlayerDelegate>
ヘッダーファイル内。
これは、.hファイルでデリゲートを定義するのを忘れていることを伝える警告です
@interface ClassName : NSObject <YourDelegate>
UIComponentブレース内にデリゲートを追加してください
例:@interface DemoView:UIView <UITableViewDelegate>
作成しているプロパティを委任するのではなく。
@property(retain)id <UITableViewDelegate> demoDelegate