0

我搜索了包括这个论坛在内的多个论坛,但找不到解决我问题的方法。当我的“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;
}

感谢您为我提供的任何帮助。

4

1 回答 1

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

这段代码创建了一个全新的IQTest对象(它是一个UIViewController子类——因此名称容易混淆),然后调用它的stop方法。

这个全新的IQTest对象(也许重命名IQTestViewController?)刚刚创建——它与开始播放声音的对象不同。所以你期望它停止播放它无法控制的东西。(至少,我不希望它工作,没有看到更多的代码。)

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

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

IQTestQuestionThree父级的视图控制器IQTest吗?(同样,考虑重命名IQTestQuestionThree为类似的名称IQTestQuestionThreeViewController。)如果是这样,您可以使用委托模式IQTestQuestionThree提醒IQTest停止播放声音。

如果您的视图控制器层次结构更复杂,和/或如果在其他地方有其他视图控制器可能想要停止播放声音,请考虑创建一个用于播放声音的模型类作为播放声音的代理,实例化该模型在您的应用程序委托中创建类,并将其传递给所有需要控制音频的视图控制器。

(UIViewController按照惯例,子类ViewController在其名称上带有“”作为后缀。您会在 Apple 的源代码中发现这种情况。如果您想编写代码以提高可读性,您应该遵循您使用的语言的约定'尽可能地重写。)

于 2012-06-01T19:53:45.613 回答