【问题标题】:UITableView inside UITableViewCell not resizing the cell heightUITableViewCell 内的 UITableView 未调整单元格高度
【发布时间】:2020-10-15 04:13:33
【问题描述】:

我创建了一个包含两个单元格的 tableView:第一个只是一个带有一些标签的 tableViewCell,是您在顶部看到的那个;第二个单元格是嵌入式表格视图。

我遇到的问题是具有嵌入式表格视图的单元格未根据嵌入式表格视图大小调整大小。在此屏幕截图中,嵌入式表格视图为绿色,红色是该嵌入式表格视图的单元格。隐藏了一些红色单元格,因为单元格没有按预期扩展。

具有嵌入式表格视图的单元格在此处定义:

嵌入表格视图的单元格是这样的:

【问题讨论】:

  • 这通常是一个糟糕的设计。您最好使用两种单元格类型/类,或者在表格视图中使用多个部分。
  • 为什么这是一个糟糕的设计?我确实有两种细胞类型。每个单元都有自己的视图,定义在 XIB 中,以及承载视图的视图模型的相应类。因此,第一个单元格充当节标题,第二个单元格充当节正文。这两个单元格都不是 UITableView 定义的节标题。不确定使用/不使用部分标题如何解决问题....有什么想法吗?

标签: ios uitableview autolayout


【解决方案1】:

一般来说,在表格视图单元格中嵌入表格视图是一个糟糕的设计,原因有很多。

  • 表格视图没有固有的高度...所以无论您添加多少单元格,它都不会设置自己的高度。有办法解决这个问题,但是...
  • 根据单元格数量更改表格视图的高度会破坏“可重用”单元格设计。表视图将其用于内存管理。
  • 您最终会滚动单元格的内容,而包含该单元格的表格视图也想要滚动。
  • 每个表格视图都需要一个单独的 dataSourcedelegate 类。

除非您的设计比您展示的要复杂得多,或者您有其他令人信服的理由将表格视图嵌入到单元格中,否则您将使用这种方法会更好:

  • 一个表格视图
  • 两个细胞类别 - 我将它们称为白色和红色以匹配您的图像
  • 一个dataSource - 如果indexPath.row == 0 则返回WhiteCell,其余行返回RedCell

以下是该方法的概述:

class WhiteCell: UITableViewCell {
    func configureCell(_ strings: [String]) -> Void {
        // configure the labels for this cell
    }
}
class RedCell: UITableViewCell {
    func configureCell(_ strings: [String]) -> Void {
        // configure the labels for this cell
    }
}

class MyTableViewController: UITableViewController {
    
    let whiteData: [String] = [
        "Line 1",
        "Line 2",
        "Line 3",
        "Line 4",
        // etc...
    ]
    
    let redData: [[String]] = [
        [ "A string 1", "A string 2", "A string 3", ],
        [ "B string 1", "B string 2", "B string 3", ],
        [ "C string 1", "C string 2", "C string 3", ],
        [ "D string 1", "D string 2", "D string 3", ],
        // etc...
    ]

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // number of red rows + the white row
        return redData.count + 1
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "WhiteCell", for: indexPath) as! WhiteCell
            cell.configureCell(whiteData)
            return cell
        }
        let cell = tableView.dequeueReusableCell(withIdentifier: "RedCell", for: indexPath) as! RedCell
        // because the red cells start at .row == 1, and the data array is zero-based,
        //  we use [indexPath.row - 1]
        cell.configureCell(redData[indexPath.row - 1])
        return cell
    }
    
}

【讨论】:

  • 谢谢。对于这个问题中的人来说,为什么内部表视图没有调整大小的答案是因为它没有固有大小。 @DonMag,我选择这种方法的原因是因为有一些样式可以连接内部表格视图的所有行,并将它们放在自己的视图中,以牺牲其他东西为代价使这更容易。我会看看我是否可以解决自己造成的自动调整大小问题。
  • @anr - 在此处发布问题时,最好充分解释您要做什么。这有助于避免此类情况。
  • 明白。并不总是可以分享细节。尽管如此,你还是涵盖了所有内容。
猜你喜欢
  • 2019-08-15
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多