我已经尝试在这里找到类似的问题,但没有成功。
我有一个包含各种内容和单元格的 UITableView。特别是,它可以显示带有 WKWebView 的自定义 UITableViewCell。 有时,当我在 willDisplayCell 上配置单元格时,此 Web View 会自动播放视频。 由于此自动播放功能,当我向上/向下滚动时,单元格不会调用委托(delegate)方法 didEndDisplayingCell 并且视频在后台保持事件状态。用户需要关闭 viewController 或整个 App。
我尝试将所有具有 WebView 的出队单元格保存在列表中,并在 scrollViewDidEndDecelerating 上手动将已保存单元格的 WebView 的内容设置为 HTML“”,使用:
cell.webView?.loadHTMLString("", baseURL: nil)
通过这种方式, WebView 可以正确地停止在后台播放视频,但问题是即使使用这种方法,单元格也不会排队并且不会调用 didEndDisplayingCell:,所以当我再次滚动到该单元格,我无法重做正确的配置以重新加载 WebView 。
您有什么提示或技巧吗?
最佳答案
我用变通方法解决了。基本上,由于某些奇怪的原因,关于 webView 在这种情况下如何处理视频,单元不会被回收。
因此,我将所有这些单元格作为实例属性保存在 Set
中,并在 scrollViewDidScroll(_:)
中检查单元格是否仍然可见。如果它不可见,我会手动从其 super View 中删除 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)
}
}
关于ios - 播放视频时未调用 UITableView didEndDisplaying,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48205479/