在另一个类中停止AVAudioPlayer

时间:2012-06-01 19:42:24

标签: ios avaudioplayer

我搜索过多个论坛,包括这个论坛,但无法找到问题的解决方案。当我的“IQTest”视图控制器加载时,我有一个声音文件设置。它播放得很好,我可以在“IQTest”视图控制器中停止声音。

IQTest.h

@interface IQTest : UIViewController
{
AVAudioPlayer *theAudio;
}
@property (nonatomic, strong) AVAudioPlayer *theAudio;
@end

IQTest.m

- (void)viewDidLoad
{
[super viewDidLoad];

NSString *path = [[NSBundle mainBundle] pathForResource:@"IQTestBackgroundMusic" ofType:@"mp3"];
AVAudioPlayer* soundTrack=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
soundTrack.numberOfLoops = -1;
self.theAudio = soundTrack;
[theAudio play];
}

当用户按下“IQTestQuestionThree”的视图控制器中的按钮时,我想停止播放声音,但是当我尝试停止声音时,它会继续播放,或者我的应用程序崩溃。我尝试了多种方法,还没有找到一种方法来阻止我的声音。

IQTestQuestionThree.m

- (IBAction) question3Answer1
{
IQTest *IQTestAudio = [[IQTest alloc] init];
[IQTestAudio.theAudio stop];

iqScaryFace.hidden = NO;
homeButton.hidden = NO;
homeButtonLabel.hidden = NO;
answer1Button.hidden = YES;
answer2Button.hidden = YES;
answer3Button.hidden = YES;
answer4Button.hidden = YES;
}

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

- (IBAction) question3Answer1
{
    IQTest *IQTestAudio = [[IQTest alloc] init];
    [IQTestAudio.theAudio stop];

此代码创建一个全新的IQTest对象(它是一个UIViewController子类 - 因此具有令人困惑的名称),然后调用其stop方法。

这个全新的IQTest对象(可能重命名为IQTestViewController?)刚刚创建 - 它与开始播放声音的对象不同。所以你期待它停止播放无法控制的东西。 (至少,如果没有看到更多代码,我认为它不会起作用。)

  

我想在用户按下按钮时停止播放声音   “IQTestQuestionThree”的视图控制器

视图层次结构是如何构建的?

IQTestQuestionThree是父级为IQTest的视图控制器吗? (同样,请考虑将IQTestQuestionThree重命名为IQTestQuestionThreeViewController。)如果是这样,您可以使用delegate patternIQTestQuestionThree警告IQTest停止播放声音

如果您的视图控制器层次结构更复杂,和/或在其他地方有其他可能想要停止播放声音的视图控制器,请考虑为声音播放创建model class以充当{{ 3}}用于播放声音,在app委托中实例化该模型类,并将其传递给需要控制音频的所有视图控制器。

按照惯例,UIViewController子类的名称后缀为“ViewController”。您会发现Apple的源代码就是这种情况。如果您想编写代码可读性,你应该遵循尽可能接近你所写的语言的约定。)