问题标签 [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.
ios - UICollectionViewCompositionalLayout 不能使用与 UICollectionViewDiffableDataSource 相同的部分?
我正在使用(有点)新的 diffable 数据源和可组合的 collectionview 布局构建一个带有集合视图的视图控制器。我制作了自己的 Section 和 Row 枚举,可以对模型中的更改(一组照片)做出反应,这会触发applySnapshot
并且一切正常。
但是..在我的createLayout
函数中我只有一个部分索引可以使用??这对我来说似乎很奇怪,为什么这两种技术不能更好地协同工作?一个与SectionIdentifierType
and一起工作ItemIdentifierType
(太棒了!),另一个仍然是基于索引的?啊。
我想要做的是这样的事情:该Section.header
部分中的所有单元格都需要全屏宽度,并具有自动高度。该部分中的每个单元格Section.photos
都将获得固定大小。并且也可以有其他部分具有不同的单元格大小,并且某些部分可以是可选的。所以基于索引的系统真的很垃圾,不能硬编码第 0 部分是标题,第 1 部分是照片:顺序可以改变,事情可能是可选的,等等。
有什么更好的方法来处理这个问题?我当然可以[Section]
在视图控制器上存储一个数组,使用节索引来获取这种Section
情况,但是没有内置的方法来获取索引的节标识符吗?因为这两种技术是同时发布的,所以这似乎是一件合乎逻辑的事情。
ios - UICollectionViewDiffableDataSource:当collection view只有0个section时,请求section 0的item数
我正在尝试制作一个时间表,其中每个部分都是一天,并且每一天都有很多项目(记录)。这是我的部分(日)课:
正如你所看到的,我正在为我的部分添加年月日属性,并使用它们使每个部分都“可清洗”,因此希望每天最多只有 1 个部分。
这是我的collectionViewController ...
但我得到这个崩溃错误:
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“当集合视图中只有 0 个部分时,请求第 0 部分中的项目数”
如果我查看数据,我可以看到所有数据都已正确填充,并且当我打印出 snapshot.sectionIdentifiers 时,它会为我提供所有这些 YearMonthDay 对象。但不知何故,数据源看到 0 个部分?
我认为对于普通数据源,我只会实现委托方法 - numberOfSections 但由于这是一个可区分的数据源,我不知道该怎么做......
编辑:
来自委托的数据是这种类型的字典:[YearMonthDay:[TestRecord]]。这是打印出来的样子
ios - 具有自定义集合视图布局的 Diffable 数据源?
在这里,我创建了一个示例应用程序,它将 diffable 数据源用于具有自定义集合视图布局的集合视图。我使用的特定布局来自本教程。
如果您不想克隆 repo 并自己尝试,这里是代码的相关部分。
不知何故,布局没有注册集合视图中确实包含项目和部分。当您正常运行它时,当您尝试应用快照时它会出错:“当集合视图中只有 0 个部分时,请求第 0 部分中的项目数”
然后,在 Pinterest 布局的 prepare() 函数中,当我设置断点并检查 collectionView.numberOfSections() 时,它返回 0。所以不知何故,快照没有与集合视图通信。请注意,我从不使用 collectionView 的委托方法 numberOfSections,因为我使用的是 diffable 数据源...
我的印象是 diffable 数据源通常与组合布局一起使用,尽管我在任何地方都没有看到这是必需的。
那么有没有办法做到这一点?
uicollectionview - diffable 数据源节标题在更新期间闪烁
我目前面临的问题是,在将新快照应用到当前数据源时,页眉、页脚和装饰视图不属于集合视图的子视图,这可能会被视为奇怪的闪烁。以前有人遇到过这个问题吗?
我通过以下方式更新数据源:
编辑:它似乎只发生在 iOS 14 设备上。
EDIT2:这是示例项目中同一问题的屏幕录像: https ://imgur.com/a/0rS9aZU
在它的代码下面:
感谢@JWK
ios - UICollectionVIew Compositional Layout & DiffableDataSource,如何开启数据预取?
使用新的 Compositional Layout & DiffableDataSource 时如何启用数据预取?
之前,我们可以通过符合自定义数据源对象来实现这一点,例如,
class CustomDataSource: NSObject, UICollectionViewDataSource, UICollectionViewDataSourcePrefetching
现在,数据源是UICollectionViewDiffableDataSource
,它只符合UICollectionViewDataSource
.
一种方法是扩展它以符合预取协议。但是,由于它将 DataSource 的协议实现封装到其更高级别的方法中,例如snapshots
和apply
。我不知道如何扩展它以符合预取协议。
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 创建这样一个系统吗?
谢谢!
swift - UICollectionViewDiffableDataSource cellProvider 比预期更频繁地调用
我正在使用 UICollectionViewDiffableDataSource 来填充我的 UICollectionView。通过 REST API 接收到项目列表后,我创建一个新快照并像这样应用它:
在 cellProvider 中设置单元格时,我从 URL 异步加载图像。我注意到,第一个单元格会疯狂地浏览所有加载的图像,并最终显示与预期不同的图像。(例如打算由最后一个单元格显示的图像)。
我决定调查并发现cellProvider 闭包的调用次数是预期的两倍。此外,collectionView.dequeueReusableCell 函数在调用的前半部分表现得很奇怪,因为它每次都返回相同的单元格,即使在 collectionView 中没有可以出队的单元格。
我的 cellProvider 关闭:
这是一个例子:
- 我创建了一个包含 4 个供应商条目的快照(为简单起见,我没有在本示例的其他部分添加任何内容)
- cellProvider 被调用 4 次(对于每个 indexPath 和条目),每次出队的单元格都是同一个。
- cellProvider 又被调用了 4 次(同样,对于每个 indexPath 和条目),这一次单元格每次都不同。
- 每次调用 cellProvider 时,我都会调用 loadImage,它会尝试在我的图像缓存中为 URL 查找图像,如果找不到,则异步加载它。
- 由于所有调用几乎同时发生,每个图像都会加载两次,并且第一个单元格显示一个又一个图像,直到它启动的 4 个 URLSession 中的最后一个返回。
我无法想象 dataSource 经常将其称为 cellProvider 闭包的预期行为,我根本无法弄清楚为什么会发生这种情况或在文档中找到任何内容。
我希望有人可以向我解释为什么会发生这种情况,如果这是预期的行为,如何使用 DiffableDataSource 正确设置具有异步图像加载的单元格。
编辑:正如@Norb Braun 所建议的,对我有用的解决方案是对我的单元格使用绝对大小而不是估计大小!
ios - Swift:如何选择返回集合视图部分的标题?
我有一个UICollectionViewDiffableDataSource
这样的:
我像这样定义我的部分标题的布局:
最后,要返回我的标题,我有这个函数返回UICollectionReusableView
如下:
很棒的是:我可以在UICollectionView
.
我想要什么:如何选择不显示特定部分的特定标题?
当我尝试nil
在以下函数中返回时:
我收到以下错误:
我对如何“可选地”返回一个部分的标题的唯一想法是注册另一个高度为零的标题视图,并在我根本不想返回任何标题时返回此标题。
但是对我来说,这似乎有点混乱,如果我可以nil
在我不显示标题时返回,那会更干净。
我究竟做错了什么?
谢谢你的帮助!
ios - UICollectionViewDiffableDataSource 动画
确实没有办法像使用 UITableViewDiffableDataSource 那样使用 UICollectionViewDiffableDataSource 为添加和删除的单元格设置动画吗?看起来 tableView 版本具有 defaultRowAnimation 属性,但 CollectionView 版本不存在这样的属性。理想情况下,我想从 tableView .default 动画样式中获得单元格折叠/展开动画
ios - 如何在我们应用快照时停止 UICollectionViewDiffableDataSource 滚动集合视图?
有什么方法可以让 UICollectionViewDiffableDataSource 在我们应用快照时停止滚动集合视图?
我正在使用这个库:https ://github.com/ra1028/DiffableDataSources
我有一种情况,我想在使用 UIRefreshControl 加载更多数据时保持集合视图滚动位置。
这就是我每次加载更多数据时更新快照的方式。