使用 invalidationContext 重新加载 UICollectionView 的补充视图(标题)时遇到问题

Posted

技术标签:

【中文标题】使用 invalidationContext 重新加载 UICollectionView 的补充视图(标题)时遇到问题【英文标题】:Trouble reloading UICollectionView's supplementary view (header) with invalidationContext 【发布时间】:2017-04-20 12:12:48 【问题描述】:

我有一个用例,我有一个 UICollectionView 用于显示照片。此集合视图有一个显示照片计数的补充视图(标题)。

我的业务逻辑有时需要从集合视图中访问 insertItems(at:)removeItems(at:),因此需要重新加载补充视图才能更新照片计数。

我正在寻找一个通用的解决方案(UICollectionView 扩展将是有利的)能够重新加载/刷新只是集合视图的补充视图。

不想要以下解决方案:

重新加载集合视图的整个部分 重新加载集合视图的数据 重绘或重新加载补充视图以外的任何内容

我只需要触发func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 并重绘补充视图的东西。

我已经尝试过了,但它会因通用 NSException 而崩溃:

 self.photosCollectionView.insertItems(at: [IndexPath(row: index, section:0)])

 let context = UICollectionViewLayoutInvalidationContext()
                context.invalidateSupplementaryElements(ofKind: UICollectionElementKindSectionHeader, at: [IndexPath(row: 0, section: 0)])

 let layout = self.photosCollectionView.collectionViewLayout as? UICollectionViewFlowLayout
                layout?.invalidateLayout(with: context)

【问题讨论】:

【参考方案1】:

在您的插入项方法和删除项方法中,只需将计数分配给标题视图标签,这样您就不必重新加载集合视图

let headerView = collectionViewDemo.supplementaryView(forElementKind: UICollectionElementKindSectionHeader, at: [0,0]) as? DemoCollectionReusableView
            headerView?.textLabel.text = self.count

【讨论】:

以上是关于使用 invalidationContext 重新加载 UICollectionView 的补充视图(标题)时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

使用重新选择计算派生状态时如何避免 React 重新渲染

怎样使用系统管理员权限重新登录windows

使用 appcache 在服务器上重新部署后 Meteor 不断重新加载

避免页面重新加载以及使用 Javascript/JQuery 重新加载时 [重复]

使用 ConfigurationManager.RefreshSection 重新加载配置而不重新启动应用程序

如何使用 Spring 重新加载属性?