如何清除包含在重复使用的自定义 UITableViewCell 中的 WKWebview?

Posted

技术标签:

【中文标题】如何清除包含在重复使用的自定义 UITableViewCell 中的 WKWebview?【英文标题】:How can I clear a WKWebview that is contained in a custom UITableViewCell that is reused? 【发布时间】:2016-10-27 13:48:24 【问题描述】:

我有一个 UITableView 可以将我的自定义 UITableViewCell 出列。 UITableViewCell 包含一个 WKWebView。在 cellForRowAtIndexPath 中,我设置了 WKWebView 应该加载的 url,webview 开始加载页面。问题是单元格的数据有时会显示“旧”数据,而新的 url 仍在加载。

我尝试先加载 about:blank,也尝试了webView.loadhtmlString("", baseURL: nil),但没有成功,因为它是异步操作。

这是我的代码片段。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: MyTableViewController.cellIdentifier, for: indexPath) as! MyTableViewCell
    cell.url = data[(indexPath as NSIndexPath).row]
    return cell

在 MyTableViewCell 中,我立即开始加载 html。 loadHTML(in:,forUrl:) 是一个私有函数,将 url 加载到 webview 中。

var url: String? 
    didSet 
        loadHTML(in:webView!, forURL:url)
    

如果有人知道如何正确执行此操作,我们将不胜感激。我看到的一些建议包括隐藏 webView 直到它完成加载。我实际上希望我的用户看到加载进度。

我认为不让 UITableViewCell 出队不是一个好主意。 (该单元格还包含其他控件。)我现在能想到的最好的方法是删除 WKWebView 并重新添加它。

【问题讨论】:

【参考方案1】:

只要不重新加载,用空视图覆盖内容怎么样(我想你可以通过 wk 委托didFinishNavigation 来检查它) 您可以省略加载,调整一下约束。 我知道这很 hacky,但如果你寻找一个快速的'n'dirty 解决方案可能会起作用。

不确定性能有多好,但可以肯定的是它不涉及重新计算约束,这与删除和重新添加 webview 是相反的

【讨论】:

感谢您的回答。这是有趣的部分。例如,当我加载包含视频的页面时。 didFinishNavigation,仅在整个视频加载后发生。在那之前我真的不想显示一个空白屏幕。如果我不隐藏或空白,其他元素会加载,视频只是稍后填充。我还尝试观察 WKWebView.estimatedProgress 并隐藏 webview 直到收到第一个进度,但是在旧数据实际消失的进度状态下并不一致 然后可能会在 - tableView:didEndDisplayingCell:forRowAtIndexPath: 中加载静态空 html 页面或 javascript

以上是关于如何清除包含在重复使用的自定义 UITableViewCell 中的 WKWebview?的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell如何清除当前ISE窗口的自定义变量

如何让用户保存自定义样式表设置[重复]

对值可能包含重复项的自定义对象的 NSMutableDictionary 进行排序

如何在 TableView 中添加不同的自定义单元格 [重复]

从 NSMutableArray 中删除重复的自定义对象,确保保留最新的重复对象

用于获取表的所有条目并且仅包含基于特定列的许多重复项中的第一个的自定义查询