2011-07-15 10 views
0

私は画像を表示し、メインメニューから選択したオーディオを再生するiphoneアプリを持っています。ビューを切り替えるときにAVAudioPlayerの停止メソッドが機能しないのはなぜですか?

ユーザーがボタンをクリックして、必要な画像/音声コンボを選択します。アニメーションでビューを切り替えるコードはうまく動作します。

新しいビューでオーディオを表示、再生、一時停止、スクラブ、および停止するコードは、すべて正常に動作します。

ただし、ユーザーが[メインメニュー]ボタンをクリックすると、再生する音声を停止します。私はviewWillDisappearを使用しています:(BOOL)stopメソッドを呼び出すためにアニメーション:ユーザーは、メインメニューの表示に切り替わると、

-(void)viewWillDisappear:(BOOL)animated { 
audioPlayer.stop; 
[super viewWillDisappear: animated];} 

このコードは、サウンドを停止しません。これを行うより良い方法はありますか?私は何か間違っているのですか?ここで

は、スニペットは、上記常駐クラス全体からコードです:

#import "twelthPoem.h" 

UIImageView *largeImageView; 

@implementation twelthPoem 

-(void)resetControls 
{ 
audioPlayer.currentTime = 0; 
scrubber.value = 0; 
[playButton setImage:[UIImage imageNamed:@"play_HL.png"] 
    forState:UIControlStateNormal]; 
} 

-(void)play:(id)sender { 


if (! audioPlayer.playing) { 
audioPlayer.play; 
[playButton setImage:[UIImage imageNamed:@"pauseHL.png"] forState:UIControlStateNormal]; 
} 
else { 
audioPlayer.pause; 
[playButton setImage:[UIImage imageNamed:@"play_HL.png"]   forState:UIControlStateNormal]; 
} 

[self becomeFirstResponder]; 
} 

-(void)stop:(id)sender { 

audioPlayer.stop; 
[self resetControls]; 
} 

-(void)changeVolume:(id)sender { 

audioPlayer.volume = volume.value; 
[self becomeFirstResponder]; 
} 

-(void)scrub:(id)sender { 

if (audioPlayer.playing) { 

audioPlayer.pause; 
audioPlayer.currentTime = scrubber.value; 
audioPlayer.play; 
} 
else 
audioPlayer.currentTime = scrubber.value; 
[self becomeFirstResponder]; 
} 

-(void)createControls { 

//play/pause button 
playButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[playButton setFrame:CGRectMake(60,405,80,20)]; 
[playButton setImage:[UIImage imageNamed:@"play_HL.png"] forState:UIControlStateNormal]; 
[playButton addTarget:self action:@selector(play:) 
forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:playButton]; 

//stop button 
stopButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[stopButton setFrame:CGRectMake(180,405,80,20)]; 
[stopButton setImage:[UIImage imageNamed:@"stopHL.png"] forState:UIControlStateNormal]; 
[stopButton addTarget:self action:@selector(stop:) 
forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:stopButton]; 

//volume control 
volume = [[UISlider alloc] initWithFrame:CGRectMake(10,445,145,20)]; 
[volume addTarget:self action:@selector(changeVolume:) 
forControlEvents:UIControlEventValueChanged]; 
volume.minimumValue = 0.0; 
volume.maximumValue = 1.0; 
volume.value = audioPlayer.volume; 
volume.continuous = YES; 
[self.view addSubview:volume]; 

//scrubber control 
scrubber = [[UISlider alloc] initWithFrame:CGRectMake(165,445,145,20)]; 
[scrubber addTarget:self action:@selector(scrub:) 
    forControlEvents:UIControlEventValueChanged]; 
scrubber.minimumValue = 0.0; 
scrubber.maximumValue = audioPlayer.duration; 
scrubber.value = audioPlayer.currentTime; 
scrubber.continuous = NO; 
[self.view addSubview:scrubber]; 

} 

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 

switch (event.subtype) 
{ 
case UIEventSubtypeRemoteControlTogglePlayPause: 
    [self play:nil]; 
    break; 

case UIEventSubtypeRemoteControlNextTrack: 
    //do nothing 
    break; 

case UIEventSubtypeRemoteControlPreviousTrack: 
    //do nothing 
    break; 
} 
} 

- (BOOL)canBecomeFirstResponder { 

return YES; 
} 

-(void)viewDidLoad {  

//for scrolling the image 

[super viewDidLoad]; 

CGRect scrollFrame = CGRectMake(0,40,320,350); 
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:scrollFrame]; 
scrollView.minimumZoomScale = 1.0; 
scrollView.maximumZoomScale = 1.5; 
scrollView.delegate = self; 


UIImage *bigImage = [UIImage imageNamed:@"birches.png"]; 



largeImageView = [[UIImageView alloc] initWithImage:bigImage]; 


[scrollView addSubview:largeImageView]; 
scrollView.contentSize = largeImageView.frame.size; //important! 



[self.view addSubview:scrollView]; 

[scrollView release]; 


//for playing the recording 

NSString *filePath = [[[NSBundle mainBundle] resourcePath] 
      stringByAppendingPathComponent:@"birches_final_mp3.mp3"]; 
NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 

NSError *error = nil; 

OSStatus status = AudioSessionInitialize(NULL, NULL, NULL, NULL);  
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
        sizeof (sessionCategory), 
        &sessionCategory); 
AudioSessionSetActive(YES); 

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL 
         error:&error]; 

     if (error) 
    NSLog(@"An error occurred: %@",error); 
     else 
    { 
    audioPlayer.volume = 0.3; 
    [audioPlayer prepareToPlay]; 

    [self createControls]; 
    } 

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return largeImageView; 
} 

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player 
{ 
    interrupted = audioPlayer.playing; 
} 

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player 
{ 
    if (interrupted) 
    audioPlayer.play; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player 
       successfully:(BOOL)flag 
{ 
    [self resetControls]; 
} 




-(void)viewWillDisappear:(BOOL)animated { 
    audioPlayer.stop; 
    [super viewWillDisappear: animated];  

} 

- (void)dealloc { 

    [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
    [scrubber release]; 
    [volume release]; 
    [audioPlayer release]; 

    [super dealloc]; 
} 

@end 

答えて

2

次の構文を使用して、Objective-Cの内のメソッドを呼び出します。

audioPlayer.stopは機能しません。

他の場所も同じです。

+0

この1作品と言うことができますので、停止は、bool次のとおりです。 – wryIP

+0

- (無効)ストップ:(ID)、送信者{ audioPlayer.stop。 [self resetControls]; } – wryIP

+0

どこでも構文を変更する必要がありますか? – wryIP

0

audioPlayer.stopは、ほとんどの場合、式の後に式が必要なため動作しません。 audioPlayer.stop = //expression、あなたは私のストップボタンによって呼び出されたときaudioPlayer.stop = YES;または[audioPlayer stop];

+0

audioPlayer.stop = YES;コードエラーがスローされます - それははいが宣言されていないと言います – wryIP

+0

私は同じ問題を抱えています。効果的に[audioPlayer stop]はプレーヤーを停止させません。私はブレークポイントを設定し、このステートメントに到達することを知っています。 Xcode 4.1を使用して – Ric

+0

私の場合は、私は完全に人生を理解していない非アクティブ化されたオブジェクトのケースでした。新しくなったときにこれを見分けるのは簡単ではありませんが、Xcode環境ではなく自分のコードであることを確認したいと思います。 – Ric

関連する問題