问题标签 [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 投票
0 回答
386 浏览

ios - UICollectionView Diffable Data Source - 如何保留部分之间的移动动画,但能够更新标题的内容?

我有2个部分。

顶部包含未选中的项目。

底部包含选中的项目。

当我选中/取消选中该项目时,我能够在两个部分之间实现漂亮的移动动画。

在此处输入图像描述

使用 Diffable Data Source 实现非常简单。


但是,对于底部的标题,我不想显示“带有选中项目的标题” ,而是显示选中项目的计数。我修改代码如下。

添加了一个附加代码以在标题中显示计数。

这是结果

在此处输入图像描述


如果你仔细观察

  1. 部分之间不再有移动动画。
  2. 这是因为,Diffable Data Source 将删除带有标识符的旧底部.check(1),并用带有新标识符的新底部替换.check(2)

我想知道,我怎样才能保留部分之间的移动动画,但能够更新标题的内容?

0 投票
0 回答
124 浏览

ios - 在重新排序单元格时,同时使用 NSDiffableDataSourceSnapshot 和 NSDiffableDataSourceSectionSnapshot 可能会导致 UICollectionView 中的断言失败

我在UICollectionView使用UICollectionViewCompositionalLayout.list. 我的集合视图支持reorderingHandlers通过UICollectionViewDiffableDataSource. 此外,我正在混合使用NSDiffableDataSourceSnapshotand NSDiffableDataSourceSectionSnapshot,这是文档中允许的:

您可以将部分快照与 NSDiffableDataSourceSnapshot 一起使用或代替NSDiffableDataSourceSnapshot

NSDiffableDataSourceSnapshot在应用 a后跟 a后重新排序单元格时,我注意到一个奇怪的错误NSDiffableDataSourceSectionSnapshot

摘录UIViewController如下所示:

我的数据源定义为:

我的最小可重现示例的全部内容包含在一个小型示例项目中。这包括单元格注册、构建UICollectionView、将其添加到视图等。

当我重新排序除应用了部分快照的部分之外的部分中的任何单元格时,我得到一个断言失败:

中的断言失败-[NSDiffableDataSourceSectionSnapshot snapshotOfParentItem:includingParentItem:],NSDiffableDataSourceSectionSnapshot.m:330

由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:索引!= NSNotFound”

如下所示的调用堆栈表明这是在框架内发生的,以准备生成重新排序后的快照。

我做错什么了吗?有解决方法吗?

0 投票
1 回答
105 浏览

swift - 应用 NSDiffableDataSourceSnapshot 是否损坏?

我在申请NSDiffableDataSourceSnapshot时遇到问题UICollectionViewDiffableDataSource。想象一下这种情况:我有两个项目,我想删除第二个项目,并且我想重新加载该部分中的所有其他项目。

我这样做:

但是随后在数据源应用程序的单元格提供程序中崩溃,因为它试图获取我不再拥有数据的项目标识符的单元格,因此我必须返回nil

奇怪的是,当我尝试调试它并在应用快照时打印我的项目时,它会打印一个项目:

但是,在此之后,在 cell provider 中,我得到了我有两个项目,但我没有

更奇怪的是,当我有 3 个项目并且我想删除一个并重新加载其他项目时,这不会发生。

解决我的问题的一种解决方法是返回空单元格而不是nil单元格提供程序:

最后一件奇怪的事情,当我这样做然后我查看 View Hierarchy 调试器时,只有一个单元格,所以看起来空单元格被删除了。

有谁知道我会做错什么,或者这只是预期的行为?因为我没有在文档中找到任何关于为某种优化、动画或其他内容提供单元格的内容。

0 投票
0 回答
213 浏览

swiftui - SwiftUI 运行时仅在 IOS15 中使用带有 uiviewrepresentable 的 collectionview 的组合布局时崩溃

使用组合布局和屏幕上的 diffable 数据源删除集合视图的 uiviewrepresentable 时出现运行时崩溃。该视图当前位于 if 语句中,如果未找到数据,它将使用空数据视图而不是显示集合。

我发现的快速解决方法是删除 if 语句并改用不透明度修饰符。

这只发生在 IOS 15 中,我也在控制台中看到了这个日志,[UICollectionViewRecursion] cv == 0x106131c00 Disabling recursion trigger logging我在以前的操作系统中没有看到这个日志。我注意到的另一件事是,这种运行时崩溃更频繁地发生在发布构建配置中。真的很喜欢组合布局和可区分的数据源,所以 id 在整个 ios 15 中继续使用它。但想确保这个错误不会继续发生。它使应用程序崩溃,尤其是在试飞/应用商店中

崩溃报告说它在 _AppearanceActionModifier.MergedBox.disappear+ 3049112 上崩溃

继承人完整的崩溃报告:

让我知道我是否可以提供更多信息来帮助解决这个问题。

0 投票
0 回答
27 浏览

ios - 如何使用异步数据源和单元格注册在 UICollectionView 拖放中实现拖放操作?

我有一个UICollectionView绑定到一个UICollectionViewDiffableDataSource,我正在生成快照并将其应用到后台串行队列上的数据源,并使用UICollectionViewCellRegistration. 我正在努力支持通过拖放对集合视图的内容进行重新排序,但我在做什么时遇到了麻烦,collectionView:performDropWithCoordinator:因此重新排序动画看起来是正确的。

通常,我会做这样的事情:

但是因为我的数据源更新发生在后台队列上,所以我至少必须异步进行快照生成和应用程序,并且我也想在那里进行实际的数据模型修改以避免挂起。而且我需要在这个方法中调用主队列dropItem上的协调器。这会导致一个奇怪的动画,其中放置的项目暂时消失(当被调用时)然后重新出现(当数据源在后台队列上更新时)。drop

到目前为止,我最好的想法是使用UICollectionViewDropPlaceholder在集合视图中保留该位置,直到数据源更新。但是要创建一个占位符,我需要一个单元重用标识符(有关 init 方法的文档),而我没有其中一个,因为我正在使用单元注册创建我的单元。

所以我的问题是:我该怎么做performDrop才能使它正常工作?如果占位符是正确的想法,我该如何在这种情况下使用它?

0 投票
0 回答
76 浏览

ios - 如何将 UICollectionViewDiffableDataSource reorderHandlers 与自定义组合布局一起使用?

从 iOS 14 开始, UICollectionViewDiffableDataSource 有一个reorderHandlers属性。它在一些示例代码中进行了演示,并在WWDC 2020 会议上讨论了 Diffable Data Sources 的进展。演示者声明您必须提供一个canReorderdidReorder闭包才能启用该功能。

示例代码在带有列表布局配置的集合视图中使用它,并使用重新排序附件配置列表单元格。和方法按预期调用canReorderdidReorder但是,如果我从单元格中删除重新排序的附件,重新排序将不再起作用——它不会调用任何一个闭包。它在我的应用程序中也不起作用,我有一个使用组合布局的网格布局。

如何在UICollectionViewDiffableDataSource没有列表单元格的情况下启用重新排序并重新排序附件?

0 投票
0 回答
16 浏览

uicollectionviewlayout - 使用带有 NSDiffableDataSource 的自定义 CollectionView 布局

我正在尝试使用NSDiffableDataSource我的自定义 CollectionView 布局。每个单元格的位置和大小取决于集合中元素的数量。它还使用 UIDynamicAnimator 来产生弹性行为。问题是当添加或删除一个新单元格时,其他单元格的布局不会改变,即使我.invalidateLayout()在应用新快照后调用也是如此。我应该在哪里称呼它?或者,我应该使用其他方法吗?

当我使用旧的 UIDataSource 方法时,一切正常。我在重新加载我的收藏之前使布局无效

我想要更流畅地更新我的收藏,所以我转向了 DiffableDataSource 方法。但我找不到使用失效和重新计算的自定义布局的任何用法。

0 投票
1 回答
56 浏览

ios - 如何支持使用 UICollectionViewDiffableDataSource 的快速滚动清理器?

我有一个UICollectionView我将数据输入使用UICollectionViewDiffableDataSource的 . 我想在它的后沿显示一个滚动条,就像我实现数据源方法indexTitlesForCollectionViewindexPathForIndexTitle. 但是数据源是 diffable 数据源对象,从 iOS 15 开始,它没有属性或闭包来提供索引标题。

索引标题应该如何使用UICollectionViewDiffableDataSource

0 投票
1 回答
105 浏览

ios - 用于 Diffable 数据源的 Objective C Hashable 对象

我正在尝试在 Objective C 中实现一个带有可区分数据源的集合视图。我知道对于 Swift,UICollectionViewDiffableDataSource 的泛型类型是同时符合 Hashable 和 Identifiable 协议的类型。但我不知道这些对应于Objective C。

所以我的问题是我是否有这样的数据源属性:

那么我需要实施什么MyItemType才能使其正常工作?仅实现以下方法是否足够,或者这些方法不正确,我需要为 Objective C 实现其他方法?

  • - (BOOL)isEqual:(id)object
  • - (NSUInteger)hash
  • - (NSComparisonResult)compare:(MyItemType *)other

我需要为我的模型对象采用什么协议?

我的项目类型.h

这是模型项的定义。这些显示在集合视图列表布局中。

0 投票
1 回答
67 浏览

ios - 在 iOS 15 上应用快照时 UICollectionViewFlowLayout 崩溃

我有UICollectionView一个简单的UICollectionViewFlowLayout. 在 iOS 15 上,首次加载视图并设置项目时会发生异常。

设置项目时在主线程上调用:

我收到以下异常:

在 iOS 14 上运行相同的项目不会崩溃。