问题标签 [uicollectionviewdiffabledatasource]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
300 浏览

ios - UICollectionViewCompositionalLayout 不能使用与 UICollectionViewDiffableDataSource 相同的部分?

我正在使用(有点)新的 diffable 数据源和可组合的 collectionview 布局构建一个带有集合视图的视图控制器。我制作了自己的 Section 和 Row 枚举,可以对模型中的更改(一组照片)做出反应,这会触发applySnapshot并且一切正常。

但是..在我的createLayout函数中我只有一个部分索引可以使用??这对我来说似乎很奇怪,为什么这两种技术不能更好地协同工作?一个与SectionIdentifierTypeand一起工作ItemIdentifierType(太棒了!),另一个仍然是基于索引的?啊。

我想要做的是这样的事情:该Section.header部分中的所有单元格都需要全屏宽度,并具有自动高度。该部分中的每个单元格Section.photos都将获得固定大小。并且也可以有其他部分具有不同的单元格大小,并且某些部分可以是可选的。所以基于索引的系统真的很垃圾,不能硬编码第 0 部分是标题,第 1 部分是照片:顺序可以改变,事情可能是可选的,等等。

有什么更好的方法来处理这个问题?我当然可以[Section]在视图控制器上存储一个数组,使用节索引来获取这种Section情况,但是没有内置的方法来获取索引的节标识符吗?因为这两种技术是同时发布的,所以这似乎是一件合乎逻辑的事情。

0 投票
1 回答
666 浏览

ios - UICollectionViewDiffableDataSource:当collection view只有0个section时,请求section 0的item数

我正在尝试制作一个时间表,其中每个部分都是一天,并且每一天都有很多项目(记录)。这是我的部分(日)课:

正如你所看到的,我正在为我的部分添加年月日属性,并使用它们使每个部分都“可清洗”,因此希望每天最多只有 1 个部分。

这是我的collectionViewController ...

但我得到这个崩溃错误:

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“当集合视图中只有 0 个部分时,请求第 0 部分中的项目数”

如果我查看数据,我可以看到所有数据都已正确填充,并且当我打印出 snapshot.sectionIdentifiers 时,它会为我提供所有这些 YearMonthDay 对象。但不知何故,数据源看到 0 个部分?

我认为对于普通数据源,我只会实现委托方法 - numberOfSections 但由于这是一个可区分的数据源,我不知道该怎么做......

编辑:

来自委托的数据是这种类型的字典:[YearMonthDay:[TestRecord]]。这是打印出来的样子

0 投票
1 回答
1284 浏览

ios - 具有自定义集合视图布局的 Diffable 数据源?

在这里,我创建了一个示例应用程序,它将 diffable 数据源用于具有自定义集合视图布局的集合视图。我使用的特定布局来自教程。

如果您不想克隆 repo 并自己尝试,这里是代码的相关部分。

不知何故,布局没有注册集合视图中确实包含项目和部分。当您正常运行它时,当您尝试应用快照时它会出错:“当集合视图中只有 0 个部分时,请求第 0 部分中的项目数”

然后,在 Pinterest 布局的 prepare() 函数中,当我设置断点并检查 collectionView.numberOfSections() 时,它返回 0。所以不知何故,快照没有与集合视图通信。请注意,我从不使用 collectionView 的委托方法 numberOfSections,因为我使用的是 diffable 数据源...

我的印象是 diffable 数据源通常与组合布局一起使用,尽管我在任何地方都没有看到这是必需的。

那么有没有办法做到这一点?

0 投票
1 回答
1000 浏览

uicollectionview - diffable 数据源节标题在更新期间闪烁

我目前面临的问题是,在将新快照应用到当前数据源时,页眉、页脚和装饰视图不属于集合视图的子视图,这可能会被视为奇怪的闪烁。以前有人遇到过这个问题吗?

我通过以下方式更新数据源:

编辑:它似乎只发生在 iOS 14 设备上。

EDIT2:这是示例项目中同一问题的屏幕录像: https ://imgur.com/a/0rS9aZU

在它的代码下面:

感谢@JWK

0 投票
1 回答
251 浏览

ios - UICollectionVIew Compositional Layout & DiffableDataSource,如何开启数据预取?

使用新的 Compositional Layout & DiffableDataSource 时如何启用数据预取?

之前,我们可以通过符合自定义数据源对象来实现这一点,例如,

class CustomDataSource: NSObject, UICollectionViewDataSource, UICollectionViewDataSourcePrefetching

现在,数据源是UICollectionViewDiffableDataSource,它只符合UICollectionViewDataSource.

一种方法是扩展它以符合预取协议。但是,由于它将 DataSource 的协议实现封装到其更高级别的方法中,例如snapshotsapply。我不知道如何扩展它以符合预取协议。

0 投票
0 回答
77 浏览

swift - 具有不同单元注册的 DiffableCollectionViewDataSource

我一直在尝试为 diffable 集合视图数据源创建一个部分,该部分可能具有 GenericItem 列表,其中此类将具有类型为 UICollectionView.CellRegistration 的属性 cellRegistration。在这个类之后,所有其他项目都将继承,如下所示:

这样我就可以将我想要的任何单元格类型放入此列表,而不必担心在数据源中检查它是哪个项目类型,然后使用相应的 CellRegistration。但我一定是忽略/误解了某些东西,因为无论我如何尝试重写它,我最终都会遇到同样的错误: Cannot convert return expression of type 'UICollectionView.CellRegistration<SomeCollectionViewCell, SomeItem>' to return type 'UICollectionView.CellRegistration<UICollectionViewCell, GenericItem>'

有人可以解释如何使用这个新的 API 创建这样一个系统吗?

谢谢!

0 投票
1 回答
526 浏览

swift - UICollectionViewDiffableDataSource cellProvider 比预期更频繁地调用

我正在使用 UICollectionViewDiffableDataSource 来填充我的 UICollectionView。通过 REST API 接收到项目列表后,我创建一个新快照并像这样应用它:

在 cellProvider 中设置单元格时,我从 URL 异步加载图像。我注意到,第一个单元格会疯狂地浏览所有加载的图像,并最终显示与预期不同的图像。(例如打算由最后一个单元格显示的图像)。

我决定调查并发现cellProvider 闭包的调用次数是预期的两倍。此外,collectionView.dequeueReusableCell 函数在调用的前半部分表现得很奇怪,因为它每次都返回相同的单元格,即使在 collectionView 中没有可以出队的单元格。

我的 cellProvider 关闭:

这是一个例子:

  1. 我创建了一个包含 4 个供应商条目的快照(为简单起见,我没有在本示例的其他部分添加任何内容)
  2. cellProvider 被调用 4 次(对于每个 indexPath 和条目),每次出队的单元格都是同一个。
  3. cellProvider 又被调用了 4 次(同样,对于每个 indexPath 和条目),这一次单元格每次都不同。
  4. 每次调用 cellProvider 时,我都会调用 loadImage,它会尝试在我的图像缓存中为 URL 查找图像,如果找不到,则异步加载它。
  5. 由于所有调用几乎同时发生,每个图像都会加载两次,并且第一个单元格显示一个又一个图像,直到它启动的 4 个 URLSession 中的最后一个返回。

我无法想象 dataSource 经常将其称为 cellProvider 闭包的预期行为,我根本无法弄清楚为什么会发生这种情况或在文档中找到任何内容。

我希望有人可以向我解释为什么会发生这种情况,如果这是预期的行为,如何使用 DiffableDataSource 正确设置具有异步图像加载的单元格。


编辑:正如@Norb Braun 所建议的,对我有用的解决方案是对我的单元格使用绝对大小而不是估计大小!

0 投票
3 回答
1285 浏览

ios - Swift:如何选择返回集合视图部分的标题?

我有一个UICollectionViewDiffableDataSource这样的:

我像这样定义我的部分标题的布局:

最后,要返回我的标题,我有这个函数返回UICollectionReusableView如下:


很棒的是:我可以在UICollectionView.

我想要什么:如何选择不显示特定部分的特定标题?

当我尝试nil在以下函数中返回时:

我收到以下错误:


我对如何“可选地”返回一个部分的标题的唯一想法是注册另一个高度为零的标题视图,并在我根本不想返回任何标题时返回此标题。

但是对我来说,这似乎有点混乱,如果我可以nil在我不显示标题时返回,那会更干净。

我究竟做错了什么?


谢谢你的帮助!

0 投票
0 回答
202 浏览

ios - UICollectionViewDiffableDataSource 动画

确实没有办法像使用 UITableViewDiffableDataSource 那样使用 UICollectionViewDiffableDataSource 为添加和删除的单元格设置动画吗?看起来 tableView 版本具有 defaultRowAnimation 属性,但 CollectionView 版本不存在这样的属性。理想情况下,我想从 tableView .default 动画样式中获得单元格折叠/展开动画

0 投票
0 回答
135 浏览

ios - 如何在我们应用快照时停止 UICollectionViewDiffableDataSource 滚动集合视图?

有什么方法可以让 UICollectionViewDiffableDataSource 在我们应用快照时停止滚动集合视图?

我正在使用这个库:https ://github.com/ra1028/DiffableDataSources

我有一种情况,我想在使用 UIRefreshControl 加载更多数据时保持集合视图滚动位置。

这就是我每次加载更多数据时更新快照的方式。