播放视频时未调用UITableView didEndDisplaying

Ale*_*rio 6 video webview uitableview ios swift

我已经尝试在这里找到类似的问题而没有成功.

我有一个UITableView与各种内容和单元格.特别是,它可以显示带有WKWebView的自定义UITableViewCell.有时这个webview有一个自动播放视频,当我在willDisplayCell上配置单元格时启动.因为这个自动播放功能,当我向上/向下滚动时,单元格不会调用委托方法didEndDisplayingCell,并且视频在后台保持活动状态.用户需要关闭viewController或整个App.


我尝试使用webview将所有出列单元格保存在列表中,并在scrollViewDidEndDecelerating上手动将已保存单元格的webview内容设置为html""使用:

cell.webView?.loadHTMLString("", baseURL: nil)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,webview正确停止在后台播放视频,但问题是即使使用这种方法,单元格也没有排队,并且没有调用didEndDisplayingCell:所以当我再次滚动到那个单元格时,我无法重做正确用于重新加载webview的配置.

你有一些提示或技巧吗?

Ric*_*zio 2

我用一个解决方法解决了。基本上,由于某种奇怪的原因,单元格不会被回收,关于 webView 在这种情况下如何处理视频。因此,我将所有这些单元格保存为 a 中的实例属性,SetscrollViewDidScroll(_:)检查单元格是否仍然可见。如果它不可见,我会手动从其超级视图中删除 webView。

var advTableViewCells = Set<AdvertisingTableViewCell>() // here I save the cell retrieved in `tableView(_:cellForRowAt:)` 

func scrollViewDidScroll(_ scrollView: UIScrollView) {  
    var cellsToRemove = Set<AdvertisingTableViewCell>() // save the cell to remove in a temporary set, to avoid removing element in a forEach
    advTableViewCells.forEach { cell in
        if !tableView.visibleCells.contains(cell) {
            cell.webView?.stopLoading()
            cell.webView?.removeFromSuperview()
            cell.webView = nil
            cellsToRemove.insert(cell)
        }
    }
    cellsToRemove.forEach { cell in
        self.advTableViewCells.remove(cell)
    }
}
Run Code Online (Sandbox Code Playgroud)