サウンドを再生するボタンを作成し、サウンドの完了後にボタンのイメージを変更したいと考えています。音と画像の変化を同期させるのに苦労しています。
ボタンを押すとサウンドクラスを呼び出すコントローラークラスがあります。サウンド クラスは (AVAudioPlayer を使用して) オーディオ ファイルを再生し、完了後にデリゲート audioPlayerDidFinishPlaying を呼び出します。このデリゲートは画像を変更する必要がありますが、サウンド デリゲートはサウンド クラスにあり、ボタンのプロパティはコントローラー クラスにあるため、デリゲートはボタンと通信できません。
(ボタンへのポインターをサウンドクラスに送信するか、NSNotificationCenterを使用することを考えましたが、よくわかりません)
問題は、デリゲートが UIButton のイメージをどのように変更できるかということです。
ここにいくつかのコードがあります:
// try1ViewController.h
@class AVSnd;
@interface try1ViewController : UIViewController <AVAudioPlayerDelegate>{
AVSnd *mAvs1;
}
@property (nonatomic, retain) AVSnd *mAvs1;
@property (weak, nonatomic) IBOutlet UIButton *button2;
@end
// try1ViewController.m
- (IBAction)Button2Pressed:(id)sender
{
//...
self.mAvs1 = [[AVSnd alloc] initWithCafFile:[NSArray arrayWithObjects: audioX2, audioY1, nil ]];
//...
[myButton2 setImage:[UIImage imageNamed:image1] forState:UIControlStateNormal];
//...
}
// AVSnd.h
@interface AVSnd : NSObject <AVAudioPlayerDelegate> {
AVAudioPlayer *mSoundPlayer;
NSArray* fileNameQueue;
int index;
}
@property (nonatomic, retain) AVAudioPlayer *mSoundPlayer;
@property (nonatomic, retain) NSArray* fileNameQueue;
@property (nonatomic, assign) int index;
-(id)initWithCafFile: (NSArray*)queue;
-(void)playWithNum: (int) num;
-(void)fadeOut;
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)mSoundPlayer successfully:(BOOL)flag;