问题标签 [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 回答
435 浏览

ios - 为什么 UICollectionViewDiffableDataSource 在没有任何变化的情况下重新加载每个单元格?

我创建了以下演示视图控制器,以在一个最小示例中重现该问题。

在这里,我使用 UICollectionViewDiffableDataSource 将相同数据的快照重复应用于相同的集合视图,并且每次重新加载所有单元格时,即使没有任何更改。

我想知道这是否是一个错误,或者我是否“持有错误”。

看起来这个其他用户也有同样的问题,尽管他们没有提供足够的信息来准确地重现错误: iOS UICollectionViewDiffableDataSource reloads all data without changes

编辑:我还发现了一个奇怪的行为 - 如果动画差异是true,则单元格不会每次都重新加载。

0 投票
1 回答
293 浏览

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

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

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

0 投票
3 回答
678 浏览

ios - 为什么在使用 CoreData、NSFetchedResultsController 和 Diffable 数据源时需要 DispatchQueue.main.async

在处理 CoreData、NSFetchedResultsController 和 Diffable 数据源时,我总是注意到我需要应用DispatchQueue.main.async.

例如,

在应用 DispatchQueue.main.async 之前

但是,在我们运行performFetchviewDidLoad,我会收到以下错误dataSource.apply

'检测到死锁:不允许在未完成异步更新的主队列上调用此方法,并且会死锁。请始终在主队列上或始终在主队列外提交更新

我可以使用以下方法“解决”问题

应用 DispatchQueue.main.async 后


之后一切正常。

但是,我们对为什么DispatchQueue.main.async需要它感到困惑,因为

  1. performFetch在主线程中运行。
  2. 回调didChangeContentWith在主线程中运行。
  3. NSFetchedResultsController正在使用主 CoreData 上下文,而不是背景上下文。

DispatchQueue.main.async因此,如果不使用,我们无法理解为什么会出现运行时错误。

你知道为什么在使用 CoreData、NSFetchedResultsController 和 Diffable 数据源时需要 DispatchQueue.main.async 吗?

以下是我们的详细代码片段。

CoreDataStack.swift

NoteViewController.swift

NSTabInfoProvider.swift

0 投票
0 回答
51 浏览

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

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

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

0 投票
1 回答
68 浏览

ios - UICollectionViewDiffableDataSource 闭包中的参数来自哪里?

无法理解 中的闭包UICollectionViewDiffableDataSource,尤其是传递给它的内容。我能找到的所有教程都解释了要输入什么而不是为什么,而且我对 Swift 和编程还是有点陌生​​。

我正在关注 Paul Hudson 的教程(他正在制作一个由App对象组成的应用商店),并在其中createDataSource()写道:

我对闭包参数的困惑在于它们来自哪里:

  • 他碰巧collectionView在 View Controller 的其他地方声明为全局变量。所以我想这是传递的必要条件?
  • 来自哪里indexPath
  • 最令人困惑的是:它怎么知道app是什么?据我所知,它没有在任何地方声明。在我看过的所有教程中都是这种情况。世界上的一个实例的概念是App从哪里来的?

非常感谢任何可以帮助我掌握这一点的人,我一直在搜索教程,但很难弄清楚这里的机制。

0 投票
0 回答
85 浏览

ios - 如何使用现代 UICollectionViewDiffableDataSource 支持自定义单元格重新排序?

基本上是标题。

如果您使用的是. UICollectionViewDiffableDataSource,则无法使用 . 的传统方法对单元格重新排序collectionView.beginInteractiveMovementForItem(at: iPath)。在 collectionView 上使用“InteractiveMovement”方法需要您实现collectionView(_:moveItemAt:to:)哪个是UICollectionViewDataSource协议方法,因为我没有使用,所以不能使用UICollectionViewDataSource,我使用的是UICollectionViewDiffableDataSource. 我尝试使用传统的“InteractiveMovement”方法使其工作,它们可能有 90% 的时间工作,但有时它们只是不起作用,我对此无能为力。

我设法收集到的唯一见解来自Apple 的“实现现代集合视图”,但这完全没用,因为演示代码显示如何支持重新排序的唯一方法是通过

具体来说,cell.accessories = [.disclosureIndicator(), .reorder(displayed: .always)]

它没用,因为我使用的是不支持添加魔法配件的自定义 collectionviewcell。

这里到底是什么解决方案?

0 投票
1 回答
843 浏览

ios - 您如何在可区分的数据源(带有组合布局的集合视图)中使用多个数据模型?

我目前在尝试在我的应用程序中开发搜索视图时碰壁了。我尝试将集合视图放置在表格视图单元格中,并使用传统的集合视图数据源委托(用于行的单元格等),但是这些实现中的任何一个在现代应用程序中似乎都远非最佳。我们的应用程序使用“朋友”、“用户”和“场地”三个模型。

我们已经成功地使用 Diffable Data Source 和组合布局将我们的模型之一填充到搜索视图中,但是当我尝试添加其他模型时,我收到以下错误:

""*** 由于未捕获的异常 'NSInternalInconsistencyException' 导致应用程序终止,原因:'无效参数不满足:section != NSNotFound' 以未捕获的 NSException 类型异常终止""

我很想链接设计,但我没有 10 声望

这是 SearchViewController

这是我们的模型的样子:

最后,这里是我们使用的自定义部分类,而不是控制器中通常的“枚举部分”,这很可能是问题所在:

最后,我应该提到,我们通过对 Firebase 的 API 调用使用完全不同的数据设置这 3 个模型。(数据在应用程序的其他任何地方都按预期运行)集合视图单元正在使用视图模型,因此在视图控制器中看到了“cell.viewModel = ...”。

几天来,我一直在努力让它按预期运行。我观看了 Apple 的所有视频,彻底检查了所有示例项目,并访问了谷歌提供的关于该主题的几乎所有链接。

这是我的第一个堆栈问题,所以如果我错过了任何重要信息,我深表歉意。肯定有人已经实现了这样的设计,我愿意接受任何实现这一目标的方法。谢谢!

0 投票
1 回答
509 浏览

ios - 使用 diffable 数据源时如何处理空状态 - UICollectionViewDiffableDataSource?

在使用传统的 UICollectionView 时,我们经常使用下面的代码来处理空状态:

在 UICollectionView 或 UITableView 中使用可区分数据源时如何处理状态?

0 投票
1 回答
181 浏览

swift - Swift Diffable Snapshot - 将新部分添加到快照并重新加载集合视图

我有一个包含部分和开头的集合视图。我想在用户创建数据并在新部分中显示数据后添加一个新部分。这是我尝试过但失败的代码。运行代码后,新部分不会出现。

谢谢!

0 投票
1 回答
338 浏览

ios - Firebase .observe() 更新值时,Swift Diffable 数据源将崩溃

我正在构建一个用户可以阅读文章的应用程序。每篇文章都由作者撰写,因此,在文章视图中,当用户单击作者的个人资料图片时,它会导航到作者的个人资料视图。

在作者简介视图中,有一个“关注”按钮,在同一视图中,还有作者的统计信息(例如,他/她写了多少篇文章,他们有多少关注者等)。与此非常接近的东西:

在此处输入图像描述

当作者个人资料视图加载时,一切正常。但是一旦用户触摸“关注”按钮,应用程序就会崩溃并出现以下错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“部分标识符计数与数据源计数不匹配。这很可能是由于标识符的散列问题。

这些是我遵循的步骤:

  1. 作者个人资料视图中的用户
  2. 用户看到“关注”按钮和显示有多少用户关注作者的统计数据
  3. 假设作者有 10 个关注者。用户点击“关注”按钮
  4. 在幕后,我进入 Firebase,获取作者,然后使用 .observeSingleEvent() 和 setValue() 将用户 ID 添加到字符串数组中:
  5. 然后我使用 Firebase 的.observe()方法读取数据,从“关注”->“关注”更新按钮状态,并从“10”->“11”增加关注者的值

编辑:代码部分:

数据源创建:

更新快照

和细胞:

这就是结果(如果我触摸“关注”按钮,红色部分会发生变化):

在此处输入图像描述

这是应用程序崩溃的地方。知道为什么吗?