【问题标题】:Remove loop AVPlayer Observer in UIPageViewController删除 UIPageViewController 中的循环 AVPlayer Observer
【发布时间】:2017-07-04 07:17:17
【问题描述】:

大家好,我遇到了 UIPageViewController 和 Notifications 的问题。

我有一个带有页面数组的页面 UIPageVewController,所以在这些页面中,我有一个 AVplayer 循环播放,如下所示:

 func loopVideo(videoPlayer:AVPlayer){
    NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil, queue: nil){
        [weak videoPlayer] notification in
        videoPlayer?.seek(to: kCMTimeZero)
        videoPlayer?.play()
    }
}

问题是当我通过滚动更改页面时,来自其他页面的通知会更改我当前正在播放的视频播放 AVPlayer。我在通知中放了一个打印,我可以看到调用其他页面的通知。我不知道我该怎么办?

我尝试使用 NotificationCenter.default.removeObserver(self) 删除 viewDidDisappear 中的通知,但没有成功。

你能帮帮我吗?

谢谢

【问题讨论】:

    标签: ios swift xcode mobile


    【解决方案1】:

    NotificationCenter.default.removeObserver(self) 在这里不起作用,因为您从未将自己添加为目标。

    而是保留对您的通知的引用并将其删除。我认为它应该看起来像这样:

    var notificationObserver:NSObjectProtocol?
    
    func loopVideo(videoPlayer:AVPlayer){
        self.notificationObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil, queue: nil){
            [weak videoPlayer] notification in
            videoPlayer?.seek(to: kCMTimeZero)
            videoPlayer?.play()
        }
    }
    
    func removeObserver() {
        NotificationCenter.default.removeObserver(self.notificationObserver)
    }
    

    【讨论】:

    • 我理解 James P 感谢您的回答,我现在可以更好地理解。我用@Sneak 的答案解决了这个问题。
    【解决方案2】:

    您只需在收到通知时进行检查。

    检查AVPlayerItem的通知对象是否与可见视图播放器playerItem、videoPlayer.currentItem相同

    或者只是检查通知中的AVPlayerItem是否与yourCustomView.playerItem相同

    编辑:

    我看到你的对象是 nil,它应该是 AVPlayerItem。 Check this thread.

    【讨论】:

    • 感谢 Sneak,正如你所说我解决了插入 player.currentItem 的问题。非常感谢亲爱的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2013-09-26
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多