当调用 `performUpdates(:)` 时,由 IGListKit 提供支持的 UICollectionView 停止滚动

Posted

技术标签:

【中文标题】当调用 `performUpdates(:)` 时,由 IGListKit 提供支持的 UICollectionView 停止滚动【英文标题】:IGListKit-powered UICollectionView stops scrolling when `performUpdates(:)` gets called 【发布时间】:2019-11-08 18:14:03 【问题描述】:

我目前遇到一个问题,当用户滚动 IGListKit 驱动的 UICollectionView 时,当调用 listAdapter.performUpdates(:) 时滚动突然停止。

在不涉及太多细节的情况下,ListAdapterDataSource 正在检查集合视图对象的Interstellar-powered observable 属性的值。托管ListAdapter 的视图控制器也订阅此属性,并在值更改时发出performUpdates(:)

我使用scrollViewWillEndDragging(:) 与IGListKit Examples 类似,在用户接近列表末尾时触发页面获取网络操作。该操作完成后使用最新项目更新可观察属性。

我的问题是,在网络操作完成并更新可观察属性(从而触发performUpdates(:))的同一时刻,滚动停止。即使旧对象数据集与新对象数据集完全相同(通过手动差异确认),当没有更多结果/页面要获取时,也会发生这种情况,

关于如何调试的任何建议?也许某个方法上的某个符号断点可以指示导致UICollectionView 的滚动停止的原因?

【问题讨论】:

你可以试试 UIView.performWithoutAnimation performUpdates(:) 。 你在哪个线程调用 performUpdates? @swift2geek 这是主线程。 IGListKit 甚至对此有断言。 你试过 UIView.performWithoutAnimation performUpdates(:) 吗? 我遇到了同样的问题,事实证明这是因为我有一个刷新控件,我正在调用self.refreshControl.endRefreshing()。马上。 【参考方案1】:

不确定它对你来说仍然是真实的@tannos ?,但如果有任何事情会面临与你和我一样的问题,我会把它留在这里。 正如@danqing 在 cmets 中提到的,这是因为UIRefreshControl

所以,像

if refreshControl.isRefreshing 
    refreshControl.endRefreshing()

可以节省您的一天:)

【讨论】:

以上是关于当调用 `performUpdates(:)` 时,由 IGListKit 提供支持的 UICollectionView 停止滚动的主要内容,如果未能解决你的问题,请参考以下文章

当 UISlider 值改变时会调用啥?

tryToPerform:with: 当 keyDown: 被调用时没有被调用

当 jQuery ajax 调用开始时,loadmask 没有触发

Android:当所有异步调用完成时通知

当调用相同的活动时如何防止分数被覆盖

当superview有手势时collectionView没有调用didSelectItemAtIndexPath