带有 NotificationCenter 和 TabBarController 的 UICollectionView 可区分数据源

Posted

技术标签:

【中文标题】带有 NotificationCenter 和 TabBarController 的 UICollectionView 可区分数据源【英文标题】:UICollectionView Diffable Data Source with NotificationCenter and TabBarController 【发布时间】:2020-08-23 17:55:11 【问题描述】:

我有 2 个嵌入到 TabBarViewController 中的 UICollectionView 控制器(一个 Storefront,客户可以看到所有产品,Backend 我可以在其中 CRUD 项目)。两个视图控制器都有单独的数据源(最初它们包括相同的项目,在我的例子中是具有“名称”和“价格”属性的对象)来填充它们。

这个想法很简单:假设我在 Backend VC 中单击一个单元格,详细 VC 以模态方式呈现,我编辑对象的一些属性并确认更改。我想要的是对对象的更改对后端 VC 和店面 VC 都是可见的。

我首先想到的是实现 NotificationCenter 以将更改从 Detail VC 广播到 Backend 和 Storefront,但事情是这样的:当我在 Backend VC 中收到项目并调用 snapshot.reloadItems 因为该项目属于后端 VC 数据源,但是当 Storefront VC 收到相同的项目时,我收到以下错误:由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效参数不满足:indexPath ||忽略InvalidItems'。

我了解可区分数据源基于项目是否相同的想法,因此当我将项目从后端的数据源传递到 Storefront 的数据源时,Storefront 的数据源不知道如何实现 快照。 reloadItems 因为它一开始就没有具有适当 id 的项目。

任何想法如何使用 diffable 数据源和 NotificationCenter 来实现上述内容?还是其他方法?

我曾考虑让 Storefront 和 Backend 共享数据源,但不确定这样做是否合理以及是否会在未来带来麻烦。

【问题讨论】:

【参考方案1】:

我找到的唯一解决方案是将模型从 Struct 更改为 Class。这样,一切都运行良好。

【讨论】:

以上是关于带有 NotificationCenter 和 TabBarController 的 UICollectionView 可区分数据源的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用带有 removeDuplicated() 的组合处理通知有时不会缓存通知

没有这样的模块错误“NotificationCenter”WatchOS,Swift

NotificationCenter.default.addObserver 不断被 Unwind Segue 调用多次

RxSwift之NotificationCenter的使用和自定义

为啥 `NotificationCenter+Rx` 在 RxCocoa 而不是 RxSwift

Swift 学习之 NotificationCenter