导航控制器中有两个视图控制器。我从第一个视图控制器转到第二个视图控制器,并在第二个视图控制器中播放音频。但是,当我按后退按钮返回第一个视图控制器时,音频停止播放。
下面是音频播放类:
@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
答案 0 :(得分:1)
因为您在第二个控制器中创建audioPlayer作为属性。弹出时,系统将释放第二个控制器,第二个控制器的任何属性都将被释放。
如果要继续播放,可以通过将第二个控制器指定为第一个控制器的强属性来创建从第一个控制器到第二个控制器的强参考点。
或者你可以简单地在第一个控制器或导航控制器中播放控制器,在第二个需要播放音频时,呼叫委托给第一个控制器或导航控制器。这样,请注意您的委托属性是弱属性,以避免强引用循环
答案 1 :(得分:0)
我猜你在第二个视图控制器中处理AudioPlayer
。
从第二个视图控制器返回时,AudioPlayer
是dealloc。所以你应该在某个地方处理它(而不是在第二个视图控制器中)