在没有滚动或动画的情况下重新加载 tableview 部分

Posted

技术标签:

【中文标题】在没有滚动或动画的情况下重新加载 tableview 部分【英文标题】:Reload tableview section without scroll or animation 【发布时间】:2015-10-26 04:57:10 【问题描述】:

我正在使用此代码重新加载 tableView 部分 -

self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.None)
self.tableView.endUpdates()

仍然是行替换动画并且表格视图滚动到顶部。

如何确保没有动画将应用于部分重新加载 + 防止表格视图滚动。

【问题讨论】:

【参考方案1】:

要防止滚动和动画,请执行以下操作:

UIView.performWithoutAnimation  
    let loc = tableView.contentOffset
    tableView.reloadRows(at: [indexPath], with: .none)
    tableView.contentOffset = loc

【讨论】:

ios9 上为我工作。惊人的技术!谢谢 Docs 说 .none 使用默认动画,但是使用此代码更新的行没有动画。谢谢。 我觉得应该是tableView.setContentOffset(loc, animated: false)而不是tableView.contentOffset = loc 在 Swift 4.1 上为我工作 contentOffset hack 对我来说不是必需的。 This answer here 就足够了。【参考方案2】:

Swift 4

实际上,防止在滚动或展开/折叠单元格期间出现疯狂动画的最佳方法是:

UIView.performWithoutAnimation 
       self.tableView.reloadRows(at: [indexPath], with: .none)

【讨论】:

这确实有效,不仅在 Swift 4 上,而且在 3.2 上也是如此。此 API 似乎从 iOS 7.0 开始可用 谢谢! 您可以跳过self 调用中的tableView.reloadRows 以使代码更简洁。 @KamilHarasimowicz:你不能删除 self 因为 UIView.performWithoutAnimation 是一个闭包。您需要在其中添加 self 【参考方案3】:

试试这个:

UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: UITableViewRowAnimation.none)
self.tableView.endUpdates()

【讨论】:

谢谢!...在 iOS 10.3 上为我工作,现在部分标题没有动画 谢谢,为我工作。但是您应该再次启用动画。 UIView.setAnimationsEnabled(true) 不适合我 endUpdates() 崩溃了。 libc++abi.dylib:以 NSException 类型的未捕获异常终止 The inserted or deleted rows use the default animations 是什么意思【参考方案4】:

斯威夫特 5

UIView.performWithoutAnimation 
   self.tableView.reloadRows(at: [indexPath], with: .none)
  

【讨论】:

【参考方案5】:

给定的答案都不适合我。 这是我找到的解决方案,希望对某人有用

斯威夫特 4:

let lastScrollOffset = tableView.contentOffset

tableView.beginUpdates()
tableView.reloadSections(IndexSet(integer: 1), with: .none)
tableView.endUpdates()

tableView.layer.removeAllAnimations()
tableView.setContentOffset(lastScrollOffset, animated: false)

【讨论】:

不适用于我,libc++abi.dylib:以 NSException 类型的未捕获异常终止【参考方案6】:

在viewDidLoad中给这个方法多加一行

self.tableView.remembersLastFocusedIndexPath = true

将此代码添加到更新后要刷新的位置

UIView.setAnimationsEnabled(false)
    self.tableView.beginUpdates()
    self.tableView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: UITableViewRowAnimation.none)
    self.tableView.endUpdates()

【讨论】:

【参考方案7】:

目标-C:

[UIView setAnimationsEnabled:NO];
   [[self tableView]beginUpdates];
   [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
   [[self tableView]endUpdates];

但我认为下面的代码更有用更好。

[UIView performWithoutAnimation:^     
                [[self tableView]beginUpdates];
                [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
                [[self tableView]endUpdates];
            ];

【讨论】:

我认为这种方法更干净。【参考方案8】:

我也遇到过这个问题。它似乎源于将 IndexPath 放入 .reloadSections 而不是它请求的 IndexSet 。这就是为什么它似乎可以与 .reloadRows 一起使用而没有问题:

tableView.reloadRows(at: [IndexPath], with: UITableView.RowAnimation)

tableView.reloadSections(IndexSet, with: UITableView.RowAnimation)

只需将要重新加载的部分包装为 IndexSet:

tableView.reloadSections(IndexSet(integer: sectionInt), with: .none)

【讨论】:

以上是关于在没有滚动或动画的情况下重新加载 tableview 部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新加载图像的情况下重新加载 collectionview 单元格

在没有重新加载活动/布局之前启动活动

具有分页动画自动的滚动视图

jQuery UI Slider - 手柄和滚动内容的动画不同步

我们可以在不重新加载页面的情况下重置 r 中的页面或对象吗

我们如何在不重新加载页面的情况下使用 javascript/jQuery 更新 URL 或查询字符串?