AVAudioPlayer 停止在不同视图控制器上播放的所有声音

AVAudioPlayer stop all sounds playing on different view controllers

我有一个带有 3 个视图控制器的应用程序。第一个生成一个 5 分钟的曲目,当它进入第二个视图时,它继续在 setVolume:2.0 中播放,第三个视图控制器也是如此。

但是在第三个 ViewCOntroller有一个 UIButton 重新生成第一个 ViewController。当它返回到第一个视图控制器时,它会再次启动该声音,而前一个已经在播放,所以它是一个混音。

现在第一个 [=13] 上的声音是 init =] 那么我怎样才能在第三个 ViewController 上停止它呢?是否有任何代码可以停止播放所有声音?

您可以在第一个 ViewController 中将 AVAudioPlayer 声明为全局变量。结果是您的第一个 ViewController 的每个实例都将能够共享同一个玩家。

AVAudioPlayer *player;

之后你可以在 ViewDidLoad 中做这样的事情:

if (!player) {
   AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
   [player play];
} else if (!player.playing) {
   [player play];
}

您可以创建共享实例并被所有 viewController 调用。所以可以参考什么时候stop/play/load等

@interface MainAVPlayer : AVAudioPlayer
+ (instancetype)shared;
@end

@implementation MainAVPlayer
+ (instancetype)shared {
  static id _sharedInstance = nil;
  static dispatch_once_t oncePredicate;
  dispatch_once(&oncePredicate, ^{
    _sharedInstance = [[self alloc] init];
  });
  return _sharedInstance;
}
@end

从其他视图控制器调用访问时:

[[MainAVPlayer shared] initWithContentsOfURL:url error:&error];
[[MainAVPlayer shared] play];

p/s: 可能有错别字,凭记忆写的