我搜索过多个论坛,包括这个论坛,但无法找到问题的解决方案。当我的“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;
}
感谢您提供的任何帮助。
答案 0 :(得分:1)
- (IBAction) question3Answer1
{
IQTest *IQTestAudio = [[IQTest alloc] init];
[IQTestAudio.theAudio stop];
此代码创建一个全新的IQTest
对象(它是一个UIViewController
子类 - 因此具有令人困惑的名称),然后调用其stop
方法。
这个全新的IQTest
对象(可能重命名为IQTestViewController
?)刚刚创建 - 它与开始播放声音的对象不同。所以你期待它停止播放无法控制的东西。 (至少,如果没有看到更多代码,我认为它不会起作用。)
我想在用户按下按钮时停止播放声音 “IQTestQuestionThree”的视图控制器
视图层次结构是如何构建的?
IQTestQuestionThree
是父级为IQTest
的视图控制器吗? (同样,请考虑将IQTestQuestionThree
重命名为IQTestQuestionThreeViewController
。)如果是这样,您可以使用delegate pattern让IQTestQuestionThree
警告IQTest
停止播放声音
如果您的视图控制器层次结构更复杂,和/或在其他地方有其他可能想要停止播放声音的视图控制器,请考虑为声音播放创建model class以充当{{ 3}}用于播放声音,在app委托中实例化该模型类,并将其传递给需要控制音频的所有视图控制器。
按照惯例,UIViewController
子类的名称后缀为“ViewController
”。您会发现Apple的源代码就是这种情况。如果您想编写代码可读性,你应该遵循尽可能接近你所写的语言的约定。)