为什么我的标签不隐藏?

时间:2017-05-26 17:05:32

标签: ios uistackview

我有一个带有stackView的tableViewCell。我想把它变成一个可折叠的细胞。我可以在tableView:cellForRowAt:

中成功设置第二个标签的隐藏状态

但是,如果我更改隐藏状态以响应单元格的点击,则可见性不会在屏幕上更改。

UIView.animate(withDuration: 0.25) { [unowned self] in
    self.disclaimers.isHidden = !cellItem.isExpanded
}

正如标签.isHidden属性一样,正确切换了cellItem.isExpanded属性。在屏幕上没有变化。

我知道这已经在主线程上了,因为tableView:didSelectRowAt:在主线程上被调用。但为了掩盖自己,我尝试使用DispatchQueue.main.async {}调用而不是UIView.animate来包装该行。没有变化。

有什么想法吗?

如果您愿意,可以使用完整项目:https://github.com/AaronBratcher/TableViewTester

问题在DisclaimersCell.swift中。第33行

1 个答案:

答案 0 :(得分:1)

夫妻问题......

除了.dequeueReusableCell之外,您不应该在cellForRowAt之外的任何地方致电。你可以在TableViewController.swift - >中执行此操作didSelectRowAt ...创建单元格的 new 实例,表格中的现有实例。将您的guard行更改为:

    guard var cellItem = helper.cellForRowAtIndexPath(indexPath) as? TableViewExpandableCellItem
        , let cell = tableView.cellForRow(at: indexPath) as? TableViewExpandableCell
        , cellItem.shouldExpand
        else { return }

这样,tableView.cellForRow(at: indexPath)将返回现有的单元格。

接下来,动画.isHidden的设置不会为您提供所需的动画。

DisclaimersCell.swift - > toggleExpansion(),更改:

    UIView.animate(withDuration: 0.25) { [unowned self] in
        self.disclaimers.isHidden = !cellItem.isExpanded
    }

简单地说:

    self.disclaimers.isHidden = !cellItem.isExpanded

然后,在TableViewController didSelectRowAt函数中:

    cellItem.isExpanded = !cellItem.isExpanded
    cell.toggleExpansion(tableViewCellItem: cellItem)

    tableView.beginUpdates()
    tableView.endUpdates()

这将告诉单元格隐藏/显示标签,将.beginUpdates()endUpdates()配对将触发重新计算表格中的行高,并为重绘设置动画。