高度从 0 更改为默认大小后不显示单元格

Posted

技术标签:

【中文标题】高度从 0 更改为默认大小后不显示单元格【英文标题】:Cell is not show after the height have changed from 0 to default size 【发布时间】:2017-08-25 23:11:42 【问题描述】:

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

当“Repeat”为“Never”时,不应显示单元格,但当“Repeat”为其他任何内容时,应显示“Repeat End”单元格。

现在的问题是,当我将重复值从“从不”选择为其他任何内容意味着我已将单元格的状态从隐藏更改为未隐藏时,单元格显示为空白。

我已经使用 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.
    

【问题讨论】:

【参考方案1】:

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

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

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

    var numberOfRows = super.tableView(tableView, numberOfRowsInSection: section)

    if (section == RepeatSection && shouldHideRepeatEnd()) 
        numberOfRows = numberOfRows - 1
    
    return numberOfRows

这样会更好看

【讨论】:

你有我可以参考的示例来源吗? 这对静态表格视图有效吗?调用 insertRows(at: with:) 时,我似乎遇到了运行时错误。 对不起。我按错了按钮,把赏金给了别人。我很感激你的回答,如果可以的话,我愿意给你荣誉。【参考方案2】:

我模拟了你的情况。

tableView.reloadRows(at: indexPaths, with: .none)真是引怪情况。

但是

tableView.reloadData() 有效

注意我使用done 按钮来切换Repeat 的值

我的代码:

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

【讨论】:

您所做的模拟可能与我的不同。正如我在我的问题中提到的(实际上是在我的代码中), reloadData 也不起作用。 # 可能与sequ​​和dismiss有关。 另外,如果我使用reloadData,动画不受影响。

以上是关于高度从 0 更改为默认大小后不显示单元格的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase Swift 加载后单元格不显示图像

具有多个标签的自我调整大小的单元格不显示多行标签

为啥集合视图中的动态集合单元格不显示为给定大小并且在 swift 3 中滚动后会发生变化

从笔尖加载的 UITableView 单元格不显示背景颜色

UITableView 的 scrollToRowAtIndexPath 在单元格不显示时不起作用?

更改大小后不显示画布