2016-03-08 2 views
0

У меня есть два контроллера вида в контроллере навигации. Я перехожу от первого контроллера представления ко второму и воспроизвожу аудио во втором контроллере. Однако, когда я нажимаю кнопку «Назад», чтобы вернуться к первому контроллеру просмотра, звук перестает воспроизводиться.iOS аудио перестает играть, когда контроллер просмотра возвращается назад

ниже аудио воспроизведения класс:

@interface AudioPlayer() 
@property AVAudioSession *audioSession; 
@property AVAudioPlayer *audioPlayer; 
@property BOOL audioPlaying; 
@property BOOL audioInterrupted; 
@end 

@implementation AudioPlayer 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     [self configureAudioSession]; 
     [self configureAudioPlayer]; 
    } 
    return self; 
} 

- (void)tryPlayMusic { 
    [_audioPlayer prepareToPlay]; 
    [_audioPlayer play]; 
    _audioPlaying = YES; 
} 

- (void) configureAudioSession { 
    // Implicit initialization of audio session 
    self.audioSession = [AVAudioSession sharedInstance]; 
    NSError *setCategoryError = nil; 
    [self.audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; 

    if (setCategoryError) { 
     NSLog(@"Error setting category! %ld", (long)[setCategoryError code]); 
    } 
} 

- (void)configureAudioPlayer { 
    // Create audio player with background music 
    NSString *audioPath = [[NSBundle mainBundle] pathForResource:@"bigbigworld" ofType:@"mp3"]; 
    NSURL *audioURL = [NSURL fileURLWithPath:audioPath]; 
    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:nil]; 
    _audioPlayer.numberOfLoops = -1; // Negative number means loop forever 
} 
@end 

ответ

1

, потому что вы создаете аудиоплеера во втором контроллере в качестве свойства. когда pop, система выпустит второй контроллер, любое свойство второго контроллера будет выпущено.

Если вы хотите продолжить игру, вы можете создать сильную контрольную точку от первого контроллера до второго, назначив второй контроллер как сильное свойство первого контроллера.

Или вы можете просто воспроизвести контроллер в первом контроллере или навигационном контроллере, а во втором - при воспроизведении звука, вызовите делегата на первый контроллер или контроллер навигации. Таким образом, обратите внимание, что ваша собственность делегата слабый атрибут, чтобы избежать сильной ссылки цикла

0

Я думаю, вы регулируете AudioPlayer во втором контроллере представления.

Когда вы возвращаетесь с второго контроллера, AudioPlayer является dealloc. Поэтому вы должны обращаться с ним где-то (не во втором контроллере)

Смежные вопросы