如何停止从 Xcode 播放的不同 class 播放背景音乐?

How to stop background music playing from a different class playing in Xcode?

我已经在 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 的不同 class 时停止播放。

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

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

你的做法是错误的,你真的应该在 ViewController 中停止音乐,而不是从另一个 class 中停止。 ViewController 应尽可能独立。

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

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

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

当您执行 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];