我想在单个表格视图中使用来自 nib 的两个不同的自定义单元格。两个原型电池具有不同的高度

Posted

技术标签:

【中文标题】我想在单个表格视图中使用来自 nib 的两个不同的自定义单元格。两个原型电池具有不同的高度【英文标题】:I want to use two different custom cells from nib in a single table view. The two prototype cells have different heights 【发布时间】:2019-06-14 17:53:46 【问题描述】:

我有一种情况,我必须为单个 tableView 使用两个不同的原型单元格。这两个原型电池具有不同的高度。当我尝试运行应用程序时,我没有得到不同的单元格高度。相反,我得到了重叠的单元格。单元格在索引 2 处相互重叠。

我为单元格制作了两个 xib,并在 tableview 中注册了这两个单元格。 Screenshot of what I am getting

extension Redeem: UITableViewDelegate, UITableViewDataSource


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 4
    

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

        if indexPath.row == 0

            let cell1 = tableView.dequeueReusableCell(withIdentifier: "RedeemCell1", for: indexPath) as! RedeemCell1
            return cell1
         else if indexPath.row == 1
             let cell1 = tableView.dequeueReusableCell(withIdentifier: "RedeemCell1", for: indexPath) as! RedeemCell1

            return cell1

         else if indexPath.row == 2
            let cell2 = tableView.dequeueReusableCell(withIdentifier: "RedeemCell2", for: indexPath)  as! RedeemCell2

            return cell2
         else if indexPath.row == 3
             let cell1 = tableView.dequeueReusableCell(withIdentifier: "RedeemCell1", for: indexPath) as! RedeemCell1

            return cell1
         else 
            let cell1 = tableView.dequeueReusableCell(withIdentifier: "RedeemCell1", for: indexPath) as! RedeemCell1

            return cell1
        

    


    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return UITableView.automaticDimension
        

【问题讨论】:

你能从 Debug View Hierarchy 添加截图吗? 我不知道如何调试视图层次结构。你能帮忙吗? 关注developer.apple.com/library/archive/documentation/…你应该点击那个红色的角按钮 我们需要了解一个高度有哪些单元格和它的内容视图 我无法在此处附上屏幕截图。我应该如何发送屏幕截图。 【参考方案1】:

我认为,单元格的布局不正确。

要定义单元格的高度,您需要一个完整的约束链 和视图(具有定义的高度)来填充内容之间的区域 视图的上边缘和下边缘。

如果您在单元格中使用 XIB,您可以更改单元格中的模拟大小,看看发生了什么。单元格应该没有损坏的约束。

【讨论】:

我不明白。如何修复它。我是一名新开发人员。感谢您的支持。 请遵循本指南:developer.apple.com/library/archive/documentation/… 因此,您应该为所有子视图添加对 4 条边(顶部、底部、左侧、右侧或宽度、高度、左侧、右侧等)的约束。 您解决了这个问题吗?如果是,您可以将我的答案标记为已解决。否则,您可以添加其他信息,以便我们为您提供帮助。 非常感谢 Davydov 的支持。【参考方案2】:

您需要实现heightForRowAt

func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat
   if indexPath.row == 0 
       return 200
    
    else if  // and so on 

或使用动态高度表单元格

【讨论】:

我用的是这两个属性:removeTableView.estimatedRowHeight = 120redeemTableView.rowHeight = UITableView.automaticDimension 那么它是动态的,所以你需要从单元格的顶部到底部正确设置约束。确保中间没有休息 好的。让我检查一下约束条件。

以上是关于我想在单个表格视图中使用来自 nib 的两个不同的自定义单元格。两个原型电池具有不同的高度的主要内容,如果未能解决你的问题,请参考以下文章

访问,从单个 nib 获取对多个视图的引用

Cocoa:将子视图添加到来自不同类和 nib 的视图

使用来自多个视图控制器的自定义 UIView

表格视图单元格高度

创建标题 NIB 并在所有视图上显示

NIB 文件中的静态表格单元格