有条件地更改UITableView中的单元格高度

时间:2019-03-20 17:33:46

标签: ios swift uitableview

我正在用表格视图制作表单。

比方说,我有4种不同类型的单元格,每个单元格都是一个具有不同答案的问题

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if sortedFixedContentType.count != 0 {
        let item = sortedFixedContentType[indexPath.row]

        switch item.typeId {
        case "1":
            let cell = tableView.dequeueReusableCell(withIdentifier: "FirstCell", for: indexPath) as! FirstCell
            return cell;

        case "2":
            let cell = tableView.dequeueReusableCell(withIdentifier: "SecondCell", for: indexPath) as! SecondCell
            cell.customDelegate = self
            return cell;
        case "3":
            let cell = tableView.dequeueReusableCell(withIdentifier: "ThirdCell", for: indexPath) as! ThirdCell
            cell.commentsTextView.delegate = self
            return cell;

        case "4":
            let cell = tableView.dequeueReusableCell(withIdentifier: "FourthCell", for: indexPath) as! FourthCell
            return cell;

}

加载tableView时,我只想显示第一个单元格,并且根据答案,将显示不同的单元格。

例如:

可以用 A B C

来回答

FirstCell

如果我回答 A SecondCell会显示为答案 X Y

如果 X 是答案,将显示ThirdCell(除了TextField之外没有其他选项),完成后将显示FourthCell

但是,如果在FirstCell中答案是 B C ,则仅直接显示FourthCell。< / p>

目前,我正在通过更改heightForRowAt中行的高度来做到这一点,尽管我认为必须有一种更简单的方法。 但是我发现一个问题:

如果我到达ThirdCell中的textField,然后更改了第一个答案,则SecondCell被隐藏,而ThirdCell不是,因为条件是第二个答案,它是已经完成,所以我考虑将每行的高度设置为条件,但是我不知道该怎么做。

所以我有两个主要问题:

  • 是否可以访问heightForRowAt并将其设置为条件?

  • 我应该这样吗?还是有更好的方法来获取我需要的东西?我读了关于动态地向表视图添加和删除行的信息,但是具有相同的单元格类型,这就是为什么我决定按其高度隐藏它们的原因。

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为常规方法是不修改高度,而是操纵数据源(节中的行数等)以显示/隐藏适当的单元格。

您应该在事件发生后适当地更新数据源,然后在可以使用func insertRows(at indexPaths: [IndexPath], with animation: UITableView.RowAnimation)tableView.deleteRowsAt(at indexPaths: [IndexPath], with animation: UITableView.RowAnimation)在tableView中插入/删除单元格后立即更新数据源

该文档可能会有所帮助:https://developer.apple.com/documentation/uikit/uitableview/1614879-insertrows

答案 1 :(得分:0)

我通常想做的是监视变量,并在更新变量时调整单元格的高度。确保为变量分配了didSet代码,以便在变量更改时表视图更新高度。

var selectedRow: Int = 999 {
        didSet {
            tableView.beginUpdates()
            tableView.endUpdates()
        }
    }

然后,就像您所做的那样,我会影响heightForRow函数内部行的高度。

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.row == selectedRow {  //assign the selected row when touched
            let thisCell = tableView.cellForRow(at: indexPath)

            if let thisHeight = thisCell?.bounds.height {
                print("Bam we got a HEIGHT!!")
                return thisHeight + 50

            }
        }
    return 60 //return a default value in case the cell height is not available
}