Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 章节标题“;“反弹”;重新加载UITableView时_Ios_Swift_Uitableview_Batch Updates - Fatal编程技术网

Ios 章节标题“;“反弹”;重新加载UITableView时

Ios 章节标题“;“反弹”;重新加载UITableView时,ios,swift,uitableview,batch-updates,Ios,Swift,Uitableview,Batch Updates,我有一个UITableView,当应用程序的状态发生变化时,它会进行批量更新。更改可能会影响多个行/节或仅影响一个节(但不影响1行或多行) 我注意到,在进行单个分区更新时(这可能会影响分区中的许多行),其他分区的分区标题会“反弹”或“移动”到以前的位置,然后设置动画恢复到原来的位置 一幅画能描绘千言万语 这些部分不是批处理更新的一部分 UITableView/控制器通过一个针对iOS 11的故事板进行设置。UITableView利用了“估计”的行和截面高度,单元格使用自动布局进行布局 UIT

我有一个
UITableView
,当应用程序的状态发生变化时,它会进行批量更新。更改可能会影响多个行/节或仅影响一个节(但不影响1行或多行)

我注意到,在进行单个分区更新时(这可能会影响分区中的许多行),其他分区的分区标题会“反弹”或“移动”到以前的位置,然后设置动画恢复到原来的位置

一幅画能描绘千言万语

这些部分不是批处理更新的一部分

UITableView
/
控制器
通过一个针对iOS 11的故事板进行设置。
UITableView
利用了“估计”的行和截面高度,单元格使用自动布局进行布局

UITableViewController
使用了一个更大的数据模型来管理状态和状态更改操作。API确保根据模型的所需状态计算所需更新(即删除和更新与“先前”状态相关,插入与“新”状态相关)

最后一步是通过批更新过程将计算出的更改应用于表视图

tableView.beginUpdates()

// Calculate the rows/sections which need to be changed

if let ops = operation.sections[.delete], ops.count > 0 {
    tableView.deleteSections(ops, with: deleteSectionAnimation)
}
if let ops = operation.sections[.update], ops.count > 0 {
    tableView.reloadSections(ops, with: reloadSectionAnimation)
}
if let ops = operation.sections[.insert], ops.count > 0 {
    tableView.insertSections(ops, with: insertSectionAnimation)
}

if let ops = operation.rows[.delete], ops.count > 0 {
    tableView.deleteRows(at: ops, with: deleteRowAnimation)
}
if let ops = operation.rows[.update], ops.count > 0 {
    tableView.reloadRows(at: ops, with: reloadRowAnimation)
}
if let ops = operation.rows[.insert], ops.count > 0 {
    tableView.insertRows(at: ops, with: insertRowAnimation)
}
tableView.endUpdates()

tableView.reloadData()
tableView.layoutIfNeeded()
行和节动画属性(即
删除节动画
)设置为
自动
。我已尝试将分区动画设置为
none
,没有任何差异

我尝试过以不同的组合删除
reloadData
layoutifneed
,虽然它们会产生其他问题,但似乎无法解决此问题

我注意到的一件事是,这似乎只发生在
UITableView
的更新在屏幕外完成时

我花了一些时间试图找到问题的解决方案(比如不调用
reloadData
),但找不到有效的方法

我是否应该查看其他属性、函数,或者更新的执行顺序是否错误

笔记
  • 这是一个“静态”表格,通过故事板设置
  • 行和节在状态更改期间被添加/删除,这似乎会触发滚动视图中的问题/更改
  • 虽然禁用动画(使用
    UIView.setAnimationEnabled
    )似乎可以解决问题,但这是一个不理想的解决方案,因为它会删除所有更新(在屏幕上或屏幕外)的动画
  • 该问题仅在滚动视图不在视图顶部时发生,而在将表格视图一直滚动到顶部时发生的更新/动画没有问题
  • 我尝试使用
    indexPathsForVisibleRows
    确定更新是在屏幕上还是在屏幕外进行,并使用
    UIView.setanimationEnabled
    禁用动画,但如果更新发生在屏幕上,而表视图未滚动到滚动视图的顶部,则无法解决此问题

您是否尝试过将
UIView.setanimationEnabled
设置为
false
?然后在完成更新后将其设置回“true”?否则,如果您已经尝试过此方法,是否可以尝试创建一个显示此问题的小项目?@TNguyen我尝试过使用
UIView.setanimationEnabled
,虽然它确实纠正了此问题,但它显然会停止我想要的所有其他动画。我一直在寻找一种解决方案,在更新不在屏幕上时使用
UIView.SetAnimationEnabled
,但由于状态管理非常复杂,因此任何时候更新都会出现在可见区域,而表格视图不在滚动视图的顶部,我遇到了与上述相同的问题,不确定这是否有效,因为我以前从未使用过它,但在阅读文档后,它可能会很有用,也许可以尝试在
UIView中使用它。在没有动画的情况下执行
@TNguyen我很确定这只是
setAnimationEnabled
的一种说服。不幸的是,禁用动画真的不是一个选项(因为当屏幕上出现更新时我需要它们)。我已经实现了一个版本,它解决了在更新过程中滚动视图在该位置反弹的问题,但节标题仍然是“反弹”/“移动”@TNguyen最重要的问题似乎是使用自动布局和估计的单元格/节高度