高度从0更改为默认大小

时间:2017-08-25 23:11:42

标签: ios uitableview swift3

我正在尝试实现一个静态表视图,根据用户选择的选项,隐藏或显示不同的表视图单元格。

enter image description here

当“重复”为“从不”时,不应显示单元格,但当“重复”为其他任何内容时,它应显示“重复结束”单元格。

enter image description here

现在的问题是,当我从“Never”中选择重复值到其他任何地方{意味着我已将单元格的状态从隐藏更改为非隐藏}时,单元格显示为空白。 enter image description here

我已经实现了show并使用heightForRowAt隐藏了

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let defaultHeight = super.tableView(tableView, heightForRowAt: indexPath)
    let heightIndexPath: [Int: [Int: CGFloat]] = [1:
        [sectionRow.startDateTimePicker.rawValue : startDateEditing ? startDateTimePickerCell.contentView.subviews.first?.frame.height ?? 0 : 0,
         sectionRow.startDateTimeZone.rawValue : startDateEditing ? defaultHeight : 0,
         sectionRow.endDateTimePicker.rawValue : endDateEditing ? endDateTimePickerCell.contentView.subviews.first?.frame.height ?? 0 : 0,
         sectionRow.endDateTimeZone.rawValue : endDateEditing ? defaultHeight : 0,
         sectionRow.repeatEnd.rawValue : repeatValue == Event.Repeat.Never ? 0 : defaultHeight]]
    let cellHeight = heightIndexPath[indexPath.section]?[indexPath.row] ?? defaultHeight
    let cell = self.tableView(tableView, cellForRowAt: indexPath)
    cell.isHidden = cellHeight == 0 ? true : false
    cell.alpha = cellHeight == 0 ? 0 : 1
    return cellHeight
}

我甚至试图更改单元格的isHidden和alpha值,但它仍然没有显示。但奇怪的是,当我更改值(不是永远不会)时,单元格会再次出现。

有什么东西我错过了展示这个隐藏的细胞吗?

顺便说一句,当重复值改变如下时,我只刷新隐藏的单元格。我甚至尝试重新加载整个表格,但它没有用。

internal var repeatValue = Event.Repeat.Never {
    didSet {
        repeatLabel.text = repeatValue.rawValue
        let indexPaths = [IndexPath(row: sectionRow.repeatEnd.rawValue, section: 1)]
        tableView.reloadRows(at: indexPaths, with: .none)
        // tableView.reloadData() // Tried this also.
    }
}

2 个答案:

答案 0 :(得分:1)

我模拟了你的情况。

tableView.reloadRows(at: indexPaths, with: .none)确实导致了奇怪的情况。

但是

tableView.reloadData()有效

请注意,我使用done按钮切换Repeat

的值

Workable Demo

我的代码:

var event_Repeat_Never = true {
    didSet {
        tableView.reloadData()
    }
}

@IBAction func test() {
    event_Repeat_Never = !event_Repeat_Never
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let defaultHeight = super.tableView(tableView, heightForRowAt: indexPath)
    var cellHeight = defaultHeight
    if indexPath.section == 1 && indexPath.row == 4 {
        cellHeight = event_Repeat_Never ? 0 : defaultHeight
    }
    let cell = self.tableView(tableView, cellForRowAt: indexPath)
    cell.isHidden = cellHeight == 0 ? true : false
    cell.alpha = cellHeight == 0 ? 0 : 1
    print("\(indexPath), \(cellHeight), \(cellHeight == 0 ? true : false), \(cellHeight == 0 ? 0 : 1)")
    return cellHeight
}

答案 1 :(得分:1)

您应该改写tableView(tableView:numberOfRowsInSection:)

调用超级实现,然后在要隐藏行时减去1。现在,您将能够通过调用为行显示/隐藏设置动画 deleteRows(at:with:)视情况而定。

insertRows(at:with:)

这看起来更好