在出现之前重新加载 UICollectionView 而不让用户看到更改

Posted

技术标签:

【中文标题】在出现之前重新加载 UICollectionView 而不让用户看到更改【英文标题】:Reloading UICollectionView before appearance without the user seeing the changes 【发布时间】:2014-10-01 14:56:27 【问题描述】:

我有一个 UICollectionView,我想在它显示之前重新加载它。集合视图源中的项目数量可能已更改,因此重新加载恰巧添加了新项目或删除了那些不应再存在的项目。

在我的视图控制器中,我有:

  public override void ViewWillAppear(bool animated)
  
     base.ViewWillAppear(animated);

     this.source.UpdateAvailableItems();
     this.CollectionView.ReloadSections(new NSIndexSet(0));
  

这是我想要的,除了如果项目被删除,集合视图出现并且用户短暂地看到这些项目消失。添加新项目的情况类似,但很难看到新项目被添加。

(ReloadData 基本上不起作用,这就是我使用 ReloadSections 的原因。请参阅:UICollectionView reloadData not functioning properly in ios 7)

(每次源的项目更改时,我都无法真正重新加载集合视图,因为当它不可见时,每秒可能会发生一百次)

有谁知道我可以在集合视图出现之前重新加载并完全呈现它的方法吗?用 UIView.PerformWithoutAnimation 包装 ReloadSections 调用也无济于事。

回答:Tim Edward 解决方案的 C# 实现:

  public override void ViewWillAppear(bool animated)
  
     base.ViewWillAppear(animated);

     this.source.UpdateAvailableItems();

     UIView.PerformWithoutAnimation(() =>
     
        this.CollectionView.PerformBatchUpdates(
           () => this.CollectionView.ReloadSections(new NSIndexSet(0)),
           null);
     );
  

【问题讨论】:

只是一个想法,但是您是否尝试过将 base.ViewWillAppear 放在覆盖的末尾而不是开头? 这是一个很好的建议,我没有尝试过,但遗憾的是我只是尝试过,但没有成功。 【参考方案1】:

你试过类似的东西吗?

[UIView setAnimationsEnabled:NO];

[collectionView performBatchUpdates:^

    // Reload sections here    

 completion:^(BOOL finished) 
    [UIView setAnimationsEnabled:YES];
];

【讨论】:

这行得通,谢谢。我已经在我的问题中发布了我的 C# 翻译。 好消息。

以上是关于在出现之前重新加载 UICollectionView 而不让用户看到更改的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 刷新右键重新加载选项不可用

内存栅栏:获取/加载和释放/存储

在使用Oracle的WEB ADI加载数据时,出现ORA-06508:无法再调用之前找到程序单元

重新加载 iOS 视图控制器

ztree重新加载无效

在页面重新加载之前执行 http 请求