在我弄明白之前,这个问题真的让我很头疼。通过参考本帖和其他一些帖子,我找到了一些线索。在我的代码中,最大的问题是每次想播放视频时都要实例化视频播放器控制器。现在,在主控制器(在这种情况下是我的DetailViewContoller)中它只会被实例化一次:
@interface DetailViewController () {
VideoPlayerViewController *videoPlayerViewController;
}
- (void) viewDidLoad
{
[super viewDidLoad];
videoPlayerViewController = [[VideoPlayerViewController alloc] initWithNibName: nil bundle: nil];
}
当我想要展示一个视频时,我会调用我的DetailViewController的startVideoPlayback方法:
- (void) startVideoPlayback: (NSString *)videoUID
{
videoPlayerViewController.videoUID = videoUID;
[self presentModalViewController: videoPlayerViewController animated: YES];
}
注意:我将传递它的“videoUID” -- 一个在应用程序的其他部分用于创建视频的唯一标识符。
在VideoPlayerViewController中(这主要是从苹果的AVPlayerDemo示例中抄袭的),一次性屏幕设置(初始化AVPlayer、设置工具栏等)在viewDidLoad中完成--现在只调用一次,所有针对每个视频的设置都在viewWillAppear中完成,然后调用prepareToPlay:
- (void) prepareToPlay
{
[self initScrubberTimer];
[self syncPlayPauseButtons];
[self syncScrubber];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *destinationPath = [documentsDirectory stringByAppendingFormat: @"/%@.mov", videoUID];
if ([self fileExists: destinationPath]) {
[pleaseWait startAnimating];
[self setURL: [NSURL fileURLWithPath: destinationPath]];
if (isFirst) {
isFirst = NO;
} else {
[self.mPlayer replaceCurrentItemWithPlayerItem: [AVPlayerItem playerItemWithURL: [NSURL fileURLWithPath: destinationPath]]];
}
}
}