У меня есть приложение с 3 контроллерами представления. Первый генерирует 5-минутный трек, и когда он переходит во второй просмотр, он продолжает играть в setVolume:2.0, и то же самое касается контроллера третьего вида.

Но на третьем ViewCOntroller есть UIButton, которые повторно генерируют первый ViewController. И когда он возвращается к контроллеру первого представления, он запускает этот звук снова, а предыдущий уже воспроизводится, так что это микс.

Теперь звук был init на первом ViewController так как я могу остановить это на третьем ViewController? Есть ли какой-нибудь код, который останавливает воспроизведение всех звуков?

1
Chaudhry Talha 30 Янв 2015 в 10:34

2 ответа

Лучший ответ

Вы можете объявить AVAudioPlayer как глобальную переменную в своем первом ViewController. Эффект будет заключаться в том, что каждый экземпляр вашего первого ViewController сможет использовать один и тот же проигрыватель.

AVAudioPlayer *player;

После этого в ViewDidLoad можно сделать что-то вроде этого:

if (!player) {
   AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
   [player play];
} else if (!player.playing) {
   [player play];
}
1
marosoaie 30 Янв 2015 в 07:51

Вы можете создать общий экземпляр и вызывать его из всех viewController. Таким образом, вы можете указать, когда нужно останавливать / воспроизводить / загружать и т. Д.

@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: возможна опечатка, запись по памяти.

1
Ikmal Ezzani 30 Янв 2015 в 08:09