如何停止在Xcode中播放不同课程的背景音乐?

时间:2015-02-19 14:09:30

标签: ios objective-c xcode audio avaudioplayer

我设置了一个音乐曲目,在ViewController.h和.m文件中播放,如下所示。我想在加载新场景时停止此操作。 (.H):

@interface ViewController : UIViewController<AVAudioPlayerDelegate>{

    AVAudioPlayer *startingMusic;

}

@property (nonatomic, retain) AVAudioPlayer *startingMusic;

@end

然后.m

@synthesize startingMusic;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *music = [[NSBundle mainBundle] pathForResource:musicTrack ofType:@"mp3"];
    startingMusic=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:music] error:NULL];
    startingMusic.delegate=self;
    startingMusic.numberOfLoops=-1;
    [startingMusic play];
}

然后尝试在新场景加载时使用此代码在init方法中使用另一个名为PlayLevel.m的类来停止播放。

ViewController *test = [[ViewController alloc] init];
[test.startingMusic stop];

然而,当新的加载时,音乐会继续播放。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

当您ViewController *test = [[ViewController alloc] init];创建新的ViewController实例时,这意味着您现在在内存中有两个ViewController对象。

您真正需要做的就是在当前的电话上拨打stop

如果您要停止与您的ViewController无关的其他控制器的音乐,您可以尝试通过通知执行此操作。

例如:

在您的ViewController.h文件中,导入后:

static NSString * const kStopMusicNotificationName = @"kStopMusicNotificationName";

ViewController viewDidLoad:

[NSNotificationCenter.defaultCenter addObserverForName:kStopMusicNotificationName object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        [self.startingMusic stop];
    }];

当你需要停止音乐时:

[NSNotificationCenter.defaultCenter postNotificationName:kStopMusicNotificationName object:nil];

答案 1 :(得分:1)

你是以错误的方式解决这个问题,你应该在ViewController内停止音乐,而不是从另一个班级停止。 ViewController应尽可能自包含。

你是如何加载第二个场景的?我想你正在使用Segue?

如果您使用的是segue,则可以覆盖-prepareForSegue函数UIViewController。然后在-prepareForSegue内停止音乐。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Stop Music
}