问题标签 [nsdiffabledatasourcesnapshot]

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 回答
293 浏览

swift - 数据未在 collectionView DiffableDataSource MVVM RxSwift 中显示

我正在学习 MVVM 和 RxSwift,我想显示来自 GitHub api 的数据并填充到 collectionViewDiffableDataSource 中。但它没有显示我的数据,即使我的快照已经设置为接受我的数据。这是我的代码

我不知道为什么,但这就像我的快照没有被调用,在 MVVM 中使用时似乎有所不同

0 投票
0 回答
23 浏览

uitableview - NSDiffableDataSourceSnapshot 也为旧数据的行调用单元格

我有一个我在 UITableView 中显示的名称列表。我正在使用 NSDiffableDataSourceSnapshot。如果添加了新名称并且我应用了快照,那么也会为现有名称调用 cellForRowAtIndexPath。为什么它不只为新名称调用 cellForRowAtIndexPath 。如何解决这个问题。下面是代码。

0 投票
0 回答
51 浏览

swift - 如何使用 diffabledatasource 更新领域?

我是领域的新手,正在尝试使用UICollectionViewDiffableDataSource. 但是,我发现在插入/删除新对象后很难更新数据源。我试图更新,NotificationToken但它崩溃了。这是我到目前为止尝试过的代码:

非常感谢您对此提供的帮助。谢谢!

0 投票
1 回答
105 浏览

swift - 应用 NSDiffableDataSourceSnapshot 是否损坏?

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

我这样做:

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

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

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

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

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

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

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

0 投票
0 回答
16 浏览

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

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

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

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

0 投票
1 回答
23 浏览

swift - 使用 UITableViewDropCoordinator 通过具有可区分数据源的 dropDelegate 动画滴

在 iOS 11 中,Apple 向 TableViews 引入了原生拖放功能,它为常见的拖放交互提供了特定的动画。假设您返回了正确的 UIDropProposal 它会很容易地在表格视图中为重新排序的放置设置动画

这将很好地动画将放置的项目插入 tableView 到它悬停的间隙中。

快进到 iOS 13+ 和 diffable 数据源的使用,我在 Apple 文档中找不到使用带有快照的 dropCoordinator 的参考,并且没有更新指南、教程或 WWDC 视频来展示如何组合两组 API。

拖放控制器将在拖动操作期间正确“管理” tableView 并移动单元格以显示拖动单元格将下降的间隙,但它不会使用coordinator.drop(dragItem, toRowAt: destinationIndexPath).

我目前的解决方法是手动更新然后应用快照:

这在一定程度上有效,但它没有与放置控制器动画集成。因此,当我拖动时,我可以获得在 tableView 中提供放置间隙的动画,但是一旦我放下它,单元格就会从其原始 indexPath 移动而不是从动画放置的项目移动(正如我所期望的这种解决方法),这是都相当笨重。

dropCoordinator 可以使 tableView 为拖动设置动画,这表明它也应该能够为 drop 设置动画,但我找不到实现这一点的方法。

任何这方面的经验都将不胜感激(在我放弃并将代码恢复为旧的 UITableViewDataSource 方法之前)。

0 投票
1 回答
84 浏览

swift - 如何使用 NSTableViewDiffableDataSource 通过 NSTableView 加载数据

我正在尝试学习如何NSTableViewDiffableDataSource使用NSTableView. 我能够在 iOS 中使用UITableViewDiffableDataSourceUICollectionViewDiffableDataSource加载数据,因为我在网上找到了一些示例。但我无法NSTableViewDiffableDataSource在 Cocoa 中使用。

在以下情况下,我有一个NSTableCellView名为TestTableCellView的子类,它显示三个字段:名字、姓氏和他或她的出生日期(以字符串形式)。

嗯......应用程序崩溃并出现错误“无效参数不令人满意:快照。 ”几天前,我测试了另一个示例,它也在同一行(dataSource.apply)崩溃。NSTableViewDiffableDataSource我在网上找不到很多例子。我发现的唯一例子是他的主题,这没有帮助。无论如何,我做错了什么?我的 Xcode 版本是 13.1。谢谢。

0 投票
1 回答
142 浏览

ios - 重新加载时带有 NSDiffableDataSource 的组合 UICollectionView 跳转

我的 UICollectionView 有一个组合布局。这是创建布局的代码。

我的模型如下所示:

数据模型要复杂得多,但为了这个问题,我删除了一些我认为在这里不相关的东西,只会造成混乱。

使用 DiffableDataSource 重新加载 collectionView 如下所示:

关键是,我想要屏幕上的 3 个部分:

  • 第一部分:一些行/项目在彼此下方
  • 第二部分:与第一部分类似,但行/项目是可选的
  • 第三部分:按钮部分。此部分始终存在。它至少有一个按钮。此部分始终包含 1 个单元格:该单元格包含带有按钮的水平堆栈视图。但是,正如我所说,至少总是有 1 个按钮。通过选中/取消选中第 2 节中的行/项目,按钮部分中有一个额外的按钮。当没有选择行时——>没有额外的按钮。当检查额外的行时,按钮的标题会根据所选/检查的行数发生变化:例如-->“发送(5)”。当仅选中 4 行时,此标题需要更改为“发送 (4)”。如果未选择任何行,则应隐藏此按钮。

从一开始就重新加载这些部分,我就遇到了麻烦。它上下跳跃。检查第2节的行时,de按钮部分不可见,因为第2节的项目列表太大,例如第一次检查/选择一行,它会跳转。之后,如果按钮部分仍然不在屏幕上,选择和取消选择行没有问题,不会发生跳转。

但是:当我滚动到底部以使按钮部分可见,然后选择一行时,集合视图会滚动一点,以使按钮看不见。当我再次滚动视线中的按钮时,单元格中的数据看起来很好,因此重新加载“正确”发生。我想要的是按钮部分不会滚动出屏幕来重新加载 UI。我通过使 Hashable 协议始终对相同的文本进行哈希处理来处理这个问题,所以没有区别,对吧?按钮标题的变化及其可见性,我通过按钮的 cellViewModel 处理。所以这工作得很好。但是按钮一直滚动到看不见的地方以重新加载。而且我不知道是什么原因造成的。

我真的需要装饰物品和东西的组合布局,所以我不能放弃这个。

提前感谢您查看并发布一些建议/修复。

0 投票
0 回答
23 浏览

ios - UICollectionViewCompositionalLayout 可选部分

我看过这个类似的问题:How to deal with empty items section in UICollectionView CompositionalLayout,但答案似乎是在快照中留下部分(我这样做了,但这留下了另一个问题,我描述稍后)或渲染一个非常小的部分。该解决方案似乎不是一个好的解决方案。


我有一个使用组合布局和可区分数据源的集合视图。集合视图有四个部分,但每个部分都是可选的,这意味着如果该部分的相应数据为空,则不应显示该部分。

代码

布局定义

我有一个部分提供程序,它使用sectionIndex来配置每个部分的外观。我认为这很糟糕,因为如果我在快照中没有第三部分的数据,例如,那么通常应该在第四部分中的所有内容现在都会有一个 indexPath,这将导致它像第三部分一样布局。

每个部分都有不同的项目大小,有些是正交滚动部分。因此,如果使用第三节布局呈现第四节数据,那么它看起来会出错。

数据源定义

这是定义数据源的地方。每个部分使用不同的数据模型类,因此我根据数据模型类的类型而不是索引路径来决定使用哪种类型的单元格。

快照构建

这里是包含每个部分(如果有数据)或排除(如果该部分为空)的位置。但是留下一个部分(例如,如果第三部分没有任何数据,那么它将被遗漏,但这将使第四部分的数据具有索引为 2 的索引路径,这将不适用于部分提供者。

如果我在快照中插入一个空部分,那仍然不起作用,因为其中一些部分有标题,所以如果它是一个有标题的部分,那么标题仍然会显示。但即使这些部分都没有标题,我认为它仍然会为该部分呈现一些额外的空白空间(但这可能是不正确的)。

概括

所以问题是,如果我的一个或多个部分没有数据,那么当它们被排除在快照之外时,这将导致后续部分的数据呈现在错误的部分中(因为部分提供者配置了基于空部分之后的每个部分的索引和 indexPaths 不再是原始 indexPath)。

问题

  1. 有没有办法让这些部分是可选的,并且任何常规视图和补充视图都不会为“空”部分呈现?
0 投票
1 回答
22 浏览

ios - 在快照中应用更改后,DiffableDataSource 无法正确更新

我正在尝试过滤 TableViewDiffableDataSource 中的用户列表。过滤后的用户数组传递给以下函数:

调试显示用户已正确附加到快照中。但应用显示正确数量的过滤用户,但仅显示完整列表顶部的用户。

即,如果我有完整的用户列表 [Chloe、Max、John、Martin]。搜索“jo”只会显示 Chloe。搜索“ma”会显示 Chloe 和 Max,而不是 Max 和 Martin。