ios - 播放视频时未调用 UITableView didEndDisplaying

标签 ios swift uitableview video webview

我已经尝试在这里找到类似的问题,但没有成功。

我有一个包含各种内容和单元格的 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/

相关文章:

ios - removefromsuperview 和 addsubview 不改变显示

ios - swift : Dropbox image upload fails due to RegEX pattern match failing

ios - 自定义 UIView 中的动画更改

ios - 将单元格添加到可见的空 UITableView 显示白色背景

ios - iPhone 上的谷歌翻译 API

ios - 将自定义 UIView 放在 UINavigationBar 的底部

ios - Firestore/Swift 4 : Check username exists?

iOS - 不工作 Sonar 脚本 'run-sonar-swift'

ios - 缩小 UITableView 标题会在标题和单元格之间创建一个间隙

ios - 在主线程上链接 UITableview 更新