当单元格移出屏幕时,如何在单元格中停止AVPlayer播放

时间:2015-11-16 21:06:25

标签: ios objective-c uitableview avplayer

场景:我有一个包含许多单元格的tableView。每个单元格都包含一个AVPlayer来播放视频。一旦用户按下单元格上的播放按钮,就会创建AVPlayer。我希望AVPlayer停止播放它的视频,并在其移动到屏幕外时完全移除。

问题:当单元格在屏幕外移动时,媒体仍将播放。因此,当我尝试删除我需要的播放器时,我的应用程序崩溃并出现错误

  

由于未捕获的异常而终止应用程序' NSInvalidArgumentException',原因:' AVPlayer的实例无法删除由另一个AVPlayer实例添加的时间观察者。'

如何创建播放器

(在单元格中)

-(void)addPlayer {

    if (!self.player) {

        // This is my custom init method
        self.player = [[AVPlayer alloc] initWithFrame:self.container.bounds contentURL:mediaURL];
        [self.player setUserInteractionEnabled:YES];
        [self.container setUserInteractionEnabled:YES];
        [self.container addSubview:self.player];
    }

}

如何添加addTimeObserver

-(void)beginObservingTime {

// This will monitor the current time of the player

    __weak STPlayer *weakSelf = self;
    self.observerToken = [self.player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1.0, NSEC_PER_SEC) queue:nil usingBlock:^ (CMTime time) {
        if (CMTimeGetSeconds(time) > self.playbackTime) {
            // done buffering
            [weakSelf updatePlaybackTime:CMTimeGetSeconds(time)];
            [weakSelf.player removeTimeObserver:weakSelf.observerToken];
            [weakSelf hideActivityIndicator];
        }
    }];
}

如何移除播放器

(在UITableViewController中)

-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(FeedCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    [cell breakDownPlayer];
}

(在单元格中)

-(void)breakDownPlayer {

    [self.player breakDown];
}

(在玩家子类中)

-(void)breakDown {

    [self.player removeTimeObserver:self.observerToken];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];
}

问题:如果UITableViewCell被调用且应用程序未崩溃,如何从didEndDisplayingCell删除播放器?

1 个答案:

答案 0 :(得分:3)

您是否尝试过在didEndDisplayingCell方法中将播放器设置为nil?

list1 = ['a','b','c']
list2 = []
list1.remove('a')
list2.append(list1)
print list2