如何在tableview单元格内设置tableView的自动高度?

时间:2019-09-18 08:52:02

标签: ios swift uitableview

我遇到一个困扰我一段时间的问题。如何为另一个表格视图单元格内的表格视图设置自动高度?

所以我有 MainTableView ,其中有 3个单元格 (此表视图具有自动高度),并且位于第3个单元格上我里面还有另一个tableView (我们称它为SecondaryTableView,它具有对其超级视图的约束)

Image1

Image2

前两个单元格是它正在工作的自动高度。

对于SecondaryTableView的设置,我尝试执行相同的操作,但对于选择xib文件的单元格。

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        tableView.dataSource = self
        tableView.delegate = self
        tableView.estimatedRowHeight = 900
        tableView.rowHeight = UITableView.automaticDimension
        registerCells()
    }

    private func registerCells() {
        tableView.register(UINib(nibName: "MainCategorySectionTableViewCell", bundle: nil), forCellReuseIdentifier: "MainCategorySectionTableViewCell")
        tableView.register(UINib(nibName: "AdPerHomePageTableViewCell", bundle: nil), forCellReuseIdentifier: "AdPerHomePageTableViewCell")
    }

我再附上一张图片,说明它在模拟器中的外观。绿色是第一个单元格,橙色是第二个单元格(已注册的单元格)。我对前两个单元格进行了一些滚动以查看差异。

Output

可能是单元格上没有数据吗?但是我已经贴了一些标签,看起来还是一样

2 个答案:

答案 0 :(得分:2)

您需要使用UITableView的intrinsicContentSize变量。

  

为子tableView创建一个子类并重写   nativeContentSize。

Dynamic row heights of a UITableView inside a UITableViewCell

答案 1 :(得分:1)

您可能需要在每个包含tableView的单元格处关闭一个闭包,一旦tableView完成重新加载数据,就会立即调用该闭包。 从您的父tableView中,只需捕获这些闭包,然后重新加载整个tableView(或相应部分)即可。

在主ViewController中

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? YourTableViewCell else {
            return UITableViewCell()
        }
        cell.onCompleteReloading = { [weak self] in 
            guard let self = self else { return }
            tableView.reloadSections([indexPath.section], animationStyle: .none)
        }
        cell.setup()
        return cell
    }

在您的单元格中,定义一个闭包

var onCompleteReloading:  (() -> Void)?

func setup() {
    // Do some stuff here
    // Then reload tableView
    self.reloadTableView()
}

func reloadTableView() {
    self.tableView.reloadData()
    self?.onCompleteReloading()
}