预加载自定义 UITableViewCells 然后让它们在 tableview 中重新使用

Posted

技术标签:

【中文标题】预加载自定义 UITableViewCells 然后让它们在 tableview 中重新使用【英文标题】:Pre-loading custom UITableViewCells then having them be re-used in the tableview 【发布时间】:2018-10-06 05:10:56 【问题描述】:

我已经看到了需要在加载 tableview 之前创建所有必需的重量级 UITableViewCells 的解决方案,当您的行数相对较少时,它可以工作。在这种情况下,tableviewcells 可以在调用 reloadData 之前创建,存储在一个数组中,然后在 cellForRowAt 方法中根据需要使用,而不是使用 dequeueReusableCell

let cell = tableView.dequeueReusableCell(withIdentifier: "CustCell") as! CustomCell

但是,对于我的应用程序,我无法创建所有必需的 tableview 单元格,因为它可能是 500 个或更多非常重的单元格,这会增加应用程序的内存使用量。

tableviewcells 包含一个 WKWebview,它加载包含大量 javascript 代码的网页;加载速度不快,并且表格视图会如此快速地生成单元格,以至于它们将有效地尝试同时进行 Web 加载,因此 CPU 成本很高,可能会导致加载错误。理想情况下,tableview 的每个单元格都需要准备好按顺序使用,然后添加到 tableview 中。

我需要创建此 UITableView 需要随时可见的单元格数量(加上它预先使用的少数几个),并在用户滚动时通过 dequeueReusableCell 重用它们。

我可以使用以下方法预先创建单元格,然后在表格视图中重复使用这些单元格吗?即我可以在 cellForRowAt 方法的上下文之外使用 dequeueReusableCell 吗?

func setupCells () 
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustCell") as! CustomCell
    cell.delegate = self
    cellArray.append(cell)

感谢您的任何想法

【问题讨论】:

为什么需要预先创建任何单元格?为什么不直接使用表格视图,因为它本来就是要使用的呢?你想解决什么问题? 好点,我会修改原来的问题 我已更新问题以说明情况 您需要先显示单元格,并在加载 web 视图时显示进度。加载 webview 后,将其添加到单元格中。 Rakesha,是的,这是另一条路线 - 将加载的网络视图添加到单元格。谢谢 【参考方案1】:

是的,您可以在 UITableView Method 之外初始化 Cell

var arrVideoCell = [VideoTableViewCell]() //Intialize variable

//Intialization
    fileprivate func getNewFeildCell() -> VideoTableViewCell
    
        let cell = Bundle.main.loadNibNamed("VideoTableViewCell", owner: nil, options: nil)?.first as! CellName
        let urlString = URL(string: "URL")
        cell.viwVideo.loadVideoURL(urlString!)
        return cell
    

//For Set data in method

func configureAudioData()

    for _ in 0...4
    
        let cell = getNewFeildCell()
        arrVideoCell.append(cell)
    

    self.tblAudioVideo.reloadData()

//Tableview 委托,数据源

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = arrVideoCell[indexPath.row]
        return cell

【讨论】:

谢谢 Nihar,但我需要创建每个使用的单元格,我不能这样做,因为需要的单元格太多 - 我需要能够创建少量单元格,加载并重复使用它们。

以上是关于预加载自定义 UITableViewCells 然后让它们在 tableview 中重新使用的主要内容,如果未能解决你的问题,请参考以下文章

从 UITableViewCells 更新 UITextFields 而无需重新加载数据

防止 UITableViewCells 出队并重新加载

从自定义路径预加载 env 文件

Chrome 自定义标签会在浏览时预加载网页吗?

Laravel 使用自定义查询预加载嵌套关系

SearchController 不搜索自定义 UITableViewCells