【问题标题】:UITableView didEndDisplaying not called when video is playing播放视频时未调用 UITableView didEndDisplaying
【发布时间】:2018-06-20 16:32:31
【问题描述】:

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

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


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

cell.webView?.loadHTMLString("", baseURL: nil)

通过这种方式,网络视图正确地停止在后台播放视频,但问题是即使使用这种方法,单元格也不会入队并且 didEndDisplayingCell: 不会被调用,所以当我再次滚动到该单元格,我无法重做正确的配置以重新加载 Web 视图。

你有什么提示或技巧吗?

【问题讨论】:

    标签: ios swift uitableview video webview


    【解决方案1】:

    我解决了一个变通办法。基本上,由于某种奇怪的原因,关于 webView 在这种情况下如何处理视频,单元格没有被回收。 所以我将所有这些单元格保存为Set 中的实例属性,并在scrollViewDidScroll(_:) 中检查该单元格是否仍然可见。如果它不可见,我会手动从其父视图中删除 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)
        }
    }
    

    【讨论】:

    • @RicoCrescenzio 这样,单元格是否被重用,prepareForReuse() 被调用,以及didEndDisplay...(当然,仅处于无网络状态)??
    • @AmitaiB 据我记得是的,这些方法被称为
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多