在一个单元格中加载多个 Xib 视图

Posted

技术标签:

【中文标题】在一个单元格中加载多个 Xib 视图【英文标题】:Loading Multiple Xib View in one cell 【发布时间】:2018-08-19 10:41:00 【问题描述】:

我的tableview有3层

第一个:标题

第二个:部分

第三个:xibviews

我的 tableviewCell 加载 Xibs 视图依赖于 indexPath.row

例如 indexPath.row 在 2 ,我想加载 CDFlightXibView

但是滚动时它太慢

我该怎么办?

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

    switch indexPath.section 
    case 0:
        print("contract detail")
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let vieww = Bundle.main.loadNibNamed("CDContractXibView", owner: self, options: nil)?.first as? CDContractXibFile

        vieww?.fillData()

        cell.contentView.addSubview(vieww!)
        vieww?.frame = cell.contentView.frame
        vieww?.center = cell.contentView.center


        return cell
    case 1:
        print("passenger")
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let vieww = Bundle.main.loadNibNamed("CDPassengerInFlightXibView", owner: self, options: nil)?.first as? CDPassengerInFlightXibFile

        vieww?.fillData()

        cell.contentView.addSubview(vieww!)
        vieww?.frame = cell.contentView.frame
        vieww?.center = cell.contentView.center


        return cell
    case 2:
        print("flight")

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let vieww = Bundle.main.loadNibNamed("CDFlightXibView", owner: self, options: nil)?.first as? CDFlightXibFile

        vieww?.fillData()
        vieww?.detailBtn.addTarget(self, action: #selector(showPassenger(_:)), for: .touchUpInside)
        vieww?.detailBtn.tag = indexPath.row

        cell.contentView.addSubview(vieww!)
        vieww?.frame = cell.contentView.frame
        vieww?.center = cell.contentView.center


        return cell

    default:
        print("nothing")
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        return cell
    

【问题讨论】:

【参考方案1】:

每次滚动时都会加载多个 xib 文件,所有这些操作都需要计算导致滚动延迟。

尝试为每个状态设计特定的 UITableViewCell 并通过 indexPath.section 案例将它们出列。

【讨论】:

我使用 indexPath.section 将 mainArray 出列用于 header ,并使用 indexPath.row 将 subArray 出列用于每个 header 我的意思是,例如对于“合同详细信息”,创建一个名为“CDContractTableViewCell”的 UITableViewCell 并将“CDContractXibView”放入其 xib 文件中,然后在 cellForRow 方法中,当 indexPath.section 等于 1 时,使用这个:let cell = tableView.dequeueReusableCell(withIdentifier: "contractCell", for: indexPath) as! CDContractTableViewCell

以上是关于在一个单元格中加载多个 Xib 视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在表格视图单元格中加载内容视图?

在 ios 中加载每个图像视图和表格视图单元格(包含 ImageView)的进度条

自定义单元格导致“NSInternalInconsistencyException”,原因:“无法在包中加载 NIB:

如何将单独的 xib 单元格注册到多个表格视图?

CollectionView 单元格未在视图控制器中加载

具有相同 XIB 单元格和按钮的多个集合视图