使用UIAlertView无法播放声音

时间:2011-05-27 21:31:50

标签: iphone objective-c tweak

我的调整的一部分必须发出声音,并在收到某个消息时显示UIAlertView。然后取消UIAlertView时,声音停止。

目前,UIAlertView显示,但声音未播放。这是我的代码

#define url(x) [NSURL URLWithString:x]

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

AVAudioPlayer *mySound;
mySound = [[AVAudioPlayer alloc] initWithContentsOfURL:url(@"/Library/Ringtones/Bell Tower.m4r") error:nil];


[mySound setNumberOfLoops:-1];  
[mySound play];

[alert show]; 
[alert release];
[mySound stop];
[mySound release];

2 个答案:

答案 0 :(得分:2)

当前代码在显示警报后立即停止声音,UIAlertViews不会阻止show方法上的当前线程。

在这种情况下,您想要的是在取消警报后停止声音。要做到这一点,你必须为你的警报设置一个委托,然后完成UIAlertViewDelegate protocol,这取决于你想要停止声音的确切时间,你应该添加代码来阻止你的播放器使用以下方法之一:代表:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex

请注意,您必须保留对玩家的引用。

查看UIAlertView文档,了解有关其生命周期的更多信息。

答案 1 :(得分:2)

在.h文件中设置委托:

@interface ViewController : UIViewController <UIAlertViewDelegate>
{
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

@end

并设置上面声明的方法。

在.m文件中执行此操作:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/ma.mp3", [[NSBundle mainBundle] resourcePath]]];

    NSError *error;

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

    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = -1;


    [audioPlayer play];

    [alert show]; 
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex==0) {
        [audioPlayer stop];

    }
    NSLog(@"U HAVE CLICKED BUTTON");
}