为什么这个声音循环不会停止?

时间:2012-12-30 19:52:55

标签: objective-c audio avfoundation uialertview avaudioplayer

我在我的应用程序中创建了一个声音循环,当用户按下出现的UIAlertView上的“确定”按钮时,我想停止。

我有两个问题:


第一

当我打开断点并为所有异常设置断点时,[audioPlayer play]上会出现异常,但日志上没有显示错误,并且在通过异常“F8-ing”之后应用程序不会崩溃,除非没有声音。


第二

我遇到的另一个问题是,在用户点击“确定”按钮后音频文件不会停止,并且断点通知表明它确实读取了[audioPlayer stop]电话。我不知道造成这些错误的是什么,我所做的一切似乎都没有帮助。


代码

AVAudioPlayer *audioPlayer;


-(void)done {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Timer Done" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
    [alert show];

    [self playAlert];
}

-(void)playAlert {
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Alarm" ofType:@"caf"];
    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
    audioPlayer.numberOfLoops = -1; //infinite

    [audioPlayer play];
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        if ([audioPlayer isPlaying]) {
            [audioPlayer stop];
        }
    }
}

请让我知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

一个明显的问题是你传递了nil作为UIView委托,所以你永远不会被回调。

   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Timer Done" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];

应该是:

   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Timer Done" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];

另一个问题是buttonIndex从零开始。所以在回调中你应该检查零而不是一个。