当我重新加载部分时,没有动画的 Tableview 仍然抖动

Posted

技术标签:

【中文标题】当我重新加载部分时,没有动画的 Tableview 仍然抖动【英文标题】:Tableview with no animation still jitters when I reload section 【发布时间】:2018-04-20 13:46:34 【问题描述】:

在 tableview 的部分。我有一些可选择的行。 在该部分的标题中,我有一个Deselect All 按钮。

deselect all 按钮需要在选择行时启用,如果未选择行则禁用。 通过读取一个布尔值来启用/禁用该按钮。我在那个布尔值上有一个didSet

var shouldEnableDeselectButton = false
    
        didSet
            if oldValue != shouldEnableDeselectButton
                DispatchQueue.main.async 
                    self.notesTable.reloadSections([self.indexofFilter], with: .none)
                
            
        
    
如果我在didSet 中什么都不做,那么它只能通过出列/向上或向下滚动并离开屏幕来更新。 见下文:

如果我这样做self.notesTable.reloadSections([someSection], with: .none),那么它不再需要节标题出列。然而,如果我选择 last 行之一,那么它会严重抖动: 见下文:

我在网上查了一下,找到了Reload tableview section without scroll or animation提到的解决方案,但它们仍然抖动

【问题讨论】:

你为什么添加这个DispatchQueue.main.async?您是否从后台线程刷新它? 没有充分的理由。解决这个问题只是徒劳的尝试 为什么在检查/取消检查时需要重新加载表部分?为什么不直接调用 reloadData() 呢?它只导致重新加载可见的行,因此它非常快速且没有动画。 所以你正在做self.notesTable.reloadSections 只是为了启用/禁用取消选择所有按钮?我要做的是对标题部分视图进行强烈引用,我可以在该视图上设置一个属性以启用/禁用,而无需刷新整个部分... @Ladislav 谢谢。所以改变那个视图的属性,会改变它吗?我的意思是它不需要任何layoutIfNeeded() 或任何形式的reload()?如果我可能会问你以前做过这个,或者你只是认为它应该工作? 【参考方案1】:

需要两件事:

    获取 headerView 的引用/指针。例如。 this 回答。

    将您的按钮作为属性。我最初只是将它作为子视图。这还不够! 为此,我将 sectionHeader 设为 UITableViewHeaderFooterView 子类,然后将按钮添加为属性。

然后我可以简单地更改按钮的isEnabled 属性。

【讨论】:

以上是关于当我重新加载部分时,没有动画的 Tableview 仍然抖动的主要内容,如果未能解决你的问题,请参考以下文章

重新加载tableview时不显示刷新动画|迅速

重新加载 UITableView 而不重新加载 Section Header

如何在swift 3中重新加载没有动画的特定单元格?

当我在 tableView 的最后一行单击“更多数据...”时,TableView 不会重新加载数据

Miles Away 没有在重新加载时更新

UITableview 没有重新加载