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

ios - 更改快照动画差异值时如何处理不一致的行为?

我将从解释事情如何工作开始:

我有具有组合布局和可区分数据源的集合视图。

单元格代表任务,用户可以单击并将其设置为今天已完成,单元格具有不同的外观,具体取决于其是否设置为已完成,并且单元格检查 CoreData 以了解它是否已完成。

现在我试图实现一个想法,即一天完成的任务进入视图的底部,因此顶部只有那些仍然必须完成的任务。为此,我为我的获取请求设置了排序描述符。

直到那一刻一切都按预期工作,但我想让这个单元格向下移动,所以我 dataSource.apply(snapshot, animatingDifferences: false)改为true

现在它的动画但单元格在设置为完成时不会改变外观。

这是我的 setupSnapshot 方法():

看看: animatingDifferences: false(left) and true(right)

动画差异:假 动画差异:真

总而言之,我的目标是:

1)动画单元格和2)设置为完成时更改外观。似乎 with animatingDifferences: falsei 只能有目标 2而 withanimatingDifferences: true只能有目标 1

我已经尝试研究过这个主题,并发现了两次应用快照的方法,一次用于部分,一次用于项目,但没有任何区别。

任何人都可以指出我在这里缺少什么?

0 投票
1 回答
319 浏览

ios - SwiftUI CollectionView 包装器无法从 updateUIViewController 应用快照

我已经实现了这样的 UICollectionView 包装器

这是 CollectionViewController 的代码

它可以工作,但我只能在 viewDidLoad 调用中加载数据源,reloadDatasource()如果然后从 UIViewControllerRepresentable 中的 updateUIViewController 再次调用此方法,则集合视图为空。

这是此示例 CollectionView 包装器的完整存储库 https://github.com/michzio/SwifUICollectionView

更新

我注意到我收到了这个错误

我还注意到,如果我更改 updateUIViewController

显示单元格。但是在点击手势上强制执行的连续刷新会挂起 UI(我认为可能有太多的项目并且计算动画有问题,但即使我将项目数量减少到 1000 它也不会冻结。)

更新 2

现在当动画:在reloadDataSource()中为真(来自updateUIViewController)我可以得到崩溃但没有信息只有EXC_BAD_ARITHM

如果我删除 CollectionViewController.viewDidLoad() 中的初始数据加载,则只调用 updateUIViewController ,这里会发生另一个奇怪的异常

* 断言失败 -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:], /Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3920.26.113/UICollectionView.m:5971 2020-05-02 07: 33:02.037804+0200 SwiftUICollectionView[40091:59004149] *由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法使同类视图出列:带有标识符 ItemCell 的 UICollectionElementKindCell - 必须为标识符注册 nib 或类或连接故事板中的原型单元格 *** 第一次抛出调用堆栈:( 0 CoreFoundation 0x00007fff23e39f0e exceptionPreprocess + 350 1 libobjc.A.dylib
0x00007fff50ad79b2 objc_exception_throw + 48 2 CoreFoundation
0x00007fff23e39c88 +[NSException raise:format:arguments:] + 88 3
Foundation 0x00007fff258a3cd2 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191 4
UIKitCore 0x00007fff4838b36e -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:] + 2426 5 UIKitCore 0x00007fff4838b53d -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:] + 88 6
SwiftUICollectionView 0x0000000108b5fcb3 $s21SwiftUICollectionView010CollectionC10ControllerC12cellProvider33_7499D878310ABE7B5F37FEF32561A438LL010collectionC09indexPath4itemSo0bC4CellCSgSo0bC0C_10Foundation05IndexP0VAA4ItemCtF + 867 7 SwiftUICollectionView 0x0000000108b62ad0 $s21SwiftUICollectionView010CollectionC10ControllerC12cellProvider33_7499D878310ABE7B5F37FEF32561A438LL010collectionC09indexPath4itemSo0bC4CellCSgSo0bC0C_10Foundation05IndexP0VAA4ItemCtFTA + 16 8 SwiftUICollectionView 0x0000000108b5ffaf $sSo16UICollectionViewC10Foundation9IndexPathV05SwiftaB04ItemCSo0aB4CellCSgIeggngo_AbehKIeggnno_TR + 15 9 libswiftUIKit.dylib 0x00007fff5170a8ce $s5UIKit29UITableViewDiffableDataSourceC05tableC012cellProviderACyxq_GSo0bC0C_So0bC4CellCSgAH_10Foundation9IndexPathVq_tctcfcAkH_ANyptcfU_ + 126 10 libswiftUIKit.dylib 0x00007fff5170a998 $sSo11UITableViewC10Foundation9IndexPathVypSo0aB4CellCSgIeggnno_ABSo07NSIndexE0CyXlAHIeyByyya_TR + 168 11 UIKitCore 0x00007fff48342a89 -[__UIDiffableDataSource collectionView:cellForItemAtIndexPath:] + 165 12 UIKitCore 0x00007fff483432d5 -[__UIDiffableDataSource _cellForItemAtIndexPath:collectionView:] + 50 13 libswiftUIKit.dylib 0x00007fff5170b036 $s5UIKit34UICollectionViewDiffableDataSourceC010collectionC0_13cellForItemAtSo0bC4CellCSo0bC0C_10Foundation9IndexPathVtFTm + 70 14 libswiftUIKit。dylib 0x00007fff5170b110 $s5UIKit34UICollectionViewDiffableDataSourceC010collectionC0_13cellForItemAtSo0bC4CellCSo0bC0C_10Foundation9IndexPathVtFToTm + 128 15 UIKitCore 0x00007fff483759d5 -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:notify:] + 416 16 UIKitCore 0x00007fff4837582f -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:] + 31 17 UIKitCore 0x00007fff48395e4e __51-[UICollectionView _viewAnimationsForCurrentUpdate]_block_invoke .1814 + 661 18 UIKitCore 0x00007fff483929e4 -[UICollectionView _viewAnimationsForCurrentUpdate] + 3213 19 UIKitCore 0x00007fff48399cde __71-[UICollectionView _updateWithItems:tentativelyForReordering:animator:]_block_invoke.1887 + 118 20 UIKitCore 0x00007fff490bb8a8 +[UIView(Animation) performWithoutAnimation:] + 84 21 UIKitCore 0x00007fff48398b24 - [UICollectionView _updateWithItems:tentativelyForReordering:animator:] + 4003 22 UIKitCore 0x00007fff48391689 -[UICollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:animator:] + 16761 23 UIKitCore 0x00007fff4839b0e6-[UICollectionContext:tentativelyForReorderWithInvalidation:]animator:] + 71 24 UIKitCore 0x00007fff4839b445 -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:animator:] + 462 25 UIKitCore 0x00007fff4839b254 -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:] + 90 26 UIKitCore 0x00007fff4839b1d7 -[UICollectionView _performBatchUpdates:completion :invalidationContext:] + 74 27 UIKitCore 0x00007fff4839b12c -[UICollectionView performBatchUpdates:completion:] + 53 28 UIKitCore 0x00007fff483aa9ef -[UICollectionView _performDiffableUpdate:] + 44 29 UIKitCore 0x00007fff4834906e -[_UIDiffableDataSourceViewUpdater _performUpdateWithCollectionViewUpdateItems:dataSourceSnapshotter:updateHandler:completion:] + 467 30 UIKitCore 0x00007fff4834213a -[__UIDiffableDataSource _commitNewDataSource:withViewUpdates:completion:] + 246 31 UIKitCore 0x00007fff4833cb22 __66-[__UIDiffableDataSource applyDifferencesFromSnapshot:completion:]_block_invoke.154 + 190 32 UIKitCore 0x00007fff4833cdb1 __66-[__UIDiffableDataSource applyDifferencesFromSnapshot:completion:]_block_invoke.180 + 107 33 libdispatch.dylib 0x0000000108e01e8e _dispatch_client_callout + 8 34 libdispatch。dylib 0x0000000108e10ae2 _dispatch_lane_barrier_sync_invoke_and_complete + 132 35 UIKitCore 0x00007fff4833c62b -[__UIDiffableDataSource applyDifferencesFromSnapshot:completion:] + 952 36 UIKitCore 0x00007fff4833d63d -[__UIDiffableDataSource applyDifferencesFromSnapshot:animatingDifferences:completion:] + 71 37 libswiftUIKit.dylib 0x00007fff5170aaf4 $s5UIKit34UICollectionViewDiffableDataSourceC5apply_20animatingDifferences10completionyAA010NSDiffableeF8SnapshotVyxq_G_SbyycSgtFTm + 212 38 SwiftUICollectionView 0x0000000108b620b9 $s21SwiftUICollectionView010CollectionC10ControllerC16reloadDataSource8snapshot9animatingy5UIKit010NSDiffablegH8SnapshotVyAA7SectionOAA4ItemCG_SbtF + 985 39 SwiftUICollectionView 0x0000000108b5682f $s21SwiftUICollectionView010CollectionC0V22updateUIViewController_7contextyAA0dcG0C_0A2UI0fG20RepresentableContextVyACGtF + 335 40 SwiftUICollectionView 0x0000000108b56a2b $s21SwiftUICollectionView010CollectionC0V0A2UI29UIViewControllerRepresentableAadEP06updatefG0_7contexty0fG4TypeQz_AD0fgH7ContextVyxGtFTW + 59 41 SwiftUI0x00007fff2c59a1b2 $s7SwiftUI42PlatformViewControllerRepresentableAdaptorV06updateD8Provider_7contexty06UIViewE4TypeQz_AA0cdF7ContextVyACyxGGtF + 290 42 SwiftUI 0x00007fff2c670439 $s7SwiftUI17PlatformViewChild33_A513612C07DFA438E70B9FA90719B40DLLV6update7contexty14AttributeGraph0O7ContextVyADyxGGz_tFyyXEfU_yyXEfU_ + 217 43 SwiftUI 0x00007fff2c7f5e20 $s7SwiftUI16ViewRendererHostPAAE21performExternalUpdateyyyyXEF + 192 44 SwiftUI 0x00007fff2c66f810 $s7SwiftUI17PlatformViewChild33_A513612C07DFA438E70B9FA90719B40DLLV6update7contexty14AttributeGraph0O7ContextVyADyxGGz_tFyyXEfU_7performL_4workyyyXE_tAA0cD13RepresentableRzlF + 224 45 SwiftUI 0x00007fff2c66e6b6$s7SwiftUI17PlatformViewChild33_A513612C07DFA438E70B9FA90719B40DLLV6update7contexty14AttributeGraph0O7ContextVyADyxGGz_tFyyXEfU_ + 2454 46 SwiftUI 0x00007fff2c6674ae $s7SwiftUI17PlatformViewChild33_A513612C07DFA438E70B9FA90719B40DLLV6update7contexty14AttributeGraph0O7ContextVyADyxGGz_tF + 590 47 SwiftUI 0x00007fff2c670940 $s7SwiftUI17PlatformViewChild33_A513612C07DFA438E70B9FA90719B40DLLVyxG14AttributeGraph07UntypedM0AafGP7_update_5graph9attributeySv_So10AGGraphRefaSo11AGAttributeatFZTW + 32 48 AttributeGraph 0x00007fff2fc46309 $sTA + 25 49 AttributeGraph 0x00007fff2fc2ed45 _ZN2AG5Graph11UpdateStack6updateEv + 455 50 AttributeGraph 0x00007fff2fc2f253 _ZN2AG5Graph16update_attributeEjb + 373 51AttributeGraph 0x00007fff2fc33d5b _ZN2AG8Subgraph6updateEj + 729 52 SwiftUI 0x00007fff2c51d690 $s7SwiftUI9ViewGraphC14runTransaction33_D63C4EB7F2B205694B6515509E76E98BLL2inySo10AGGraphRefa_tF + 224 53 SwiftUI 0x00007fff2c51da67 $s7SwiftUI9ViewGraphC13updateOutputs2atyAA4TimeV_tFSb5prefs_Sb9idealSizeAC0F0V7outputstSo10AGGraphRefaXEfU_ + 103 54 SwiftUI 0x00007fff2c51d74d $s7SwiftUI9ViewGraphC13updateOutputs2atyAA4TimeV_tF + 125 55 SwiftUI 0x00007fff2c80146b $s7SwiftUI16ViewRendererHostPAAE6render8interval17updateDisplayListySd_SbtFyyXEfU_yyXEfU_ + 811 56 SwiftUI 0x00007fff2c8008c3 $s7SwiftUI16ViewRendererHostPAAE6render8interval17updateDisplayListySd_SbtFyyXEfU_ + 547 57SwiftUI 0x00007fff2c7f6415 $s7SwiftUI16ViewRendererHostPAAE6render8interval17updateDisplayListySd_SbtF + 373 58 SwiftUI 0x00007fff2c956102 $s7SwiftUI14_UIHostingViewC14layoutSubviewsyyF + 226 59 SwiftUI
0x00007fff2c956125 $s7SwiftUI14_UIHostingViewC14layoutSubviewsyyFTo + 21 60 UIKitCore 0x00007fff490c9848 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2478 61 QuartzCore 0x00007fff2b4ae3f0 -[CALayer]2 QuartlayerzCore layout+25566
0x00007fff2b4b457b _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 523 63 QuartzCore 0x00007fff2b4bfc12 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 80 64 QuartzCore 0x00007fff2b408c84 _ZN2CA7Context18commit_transactionEPNS_11TransactionEd + 324 65 QuartzCore 0x00007fff2b43c65f _ZN2CA11Transaction6commitEv + 649 66 UIKitCore 0x00007fff48bdfc2b __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 81 67 CoreFoundation 0x00007fff23d9dcdc __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK
+ 12 68 CoreFoundation 0x00007fff23d9d3d3 __CFRunLoopDoBlocks + 195 69 CoreFoundation 0x00007fff23d981c3 __CFRunLoopRun + 995 70 CoreFoundation
0x00007fff23d97ac4 CFRunLoopRunSpecific + 404 71 GraphicsServices
0x00007fff38b2fc1a GSEventRunModal + 139 72 UIKitCore
0x00007fff48bc7f80 UIApplicationMain + 1605 73 SwiftUICollectionView 0x0000000108b548fb main + 75 74 libdyld.dylib
0x00007fff519521fd start + 1 )

我忘了说当我用简单的 UICollectionFlowLayout 替换 CompositionalLayout 时,这个异常开始发生了!

0 投票
1 回答
568 浏览

uicollectionview - CollectionView 使用 NSDiffableDataSource 和 UICollectionViewFlowLayout

当我使用 UICollectionView 和 UICollectionViewFlowLayout 设置时。然后尝试通过应用数据源的快照

我在延迟 3 秒后应用第二个快照时崩溃。崩溃仅在动画时发生:true

如果我将动画设置为 false,则不会发生崩溃,但如果留空则集合视图。

这是应用数据源的方法

数据源只是

您可以玩的完整项目(可能会随着时间而变化):https ://github.com/michzio/SwifUICollectionView

更新

我试图简化示例并执行类似的操作,但它无法正常工作。似乎将 .apply() 移动到后台队列,其他队列导致collectionview中的数据为空

0 投票
1 回答
162 浏览

ios - 永远不会为 UICollectionViewDiffableDataSource 执行 CellProvider 闭包

0 投票
0 回答
172 浏览

ios - iOS UICollectionViewDiffableDataSource 重新加载所有数据而不做任何更改

我有一个简单UICollectionView的 1 个部分和 1 个项目类型,由新的 iOS 13 提供支持UICollectionViewDiffableDataSource

即使没有更改数据源(相同hashValue的 s),也会UICollectionViewDiffableDataSource更新整个集合视图(调用cellProvier每个可见单元格)。

问题是,与预期相同的场景UITableViewDiffableDataSource,即没有更改数据源UITableViewDiffableDataSource 什么都不做

这是设计上的差异,还是某种错误?

0 投票
1 回答
497 浏览

ios - Crash number of items in section 0 when there are only 0 sections in the collection view

I want to learn using UICollectionViewDiffableDataSource using Pinterest Layout, but when I try to running my simulator. it crash and give me a message

request for number of items in section 0 when there are only 0 sections in the collection view

I did the Pinterest layout using raywenderlich tutorial , when I stumble in google the problem cause is the Pinterest layout. but before I use the diffableDataSource it works fine, but after using diffableDataSource it crash. where do I do wrong? can you help me, this is my code for diffableDataSource

0 投票
2 回答
326 浏览

swift - 获取“NSInternalInconsistencyException”,原因:“无效的第 0 节。” 在多个部分进行搜索时

在多个部分进行搜索时出现异常。在数据源上应用快照时会发生这种情况。

背景:我有(预定义的)部分,每个部分都有一个项目集合。如果节中没有项目,节将不会出现在 viewController 中。通过应用程序的功能添加项目。在其中一个部分中添加项目后,将调用数据源更新并将显示添加了该项目的部分。

问题:尝试两次搜索不存在的项目时遇到此问题。要重现,您可以输入一个不存在的项目,然后通过退格删除搜索字符串,然后再次输入一个不存在的项目,然后 dataSource.apply() 将抛出错误。

希望有人可以提供帮助。蒂亚!

这是代码:

0 投票
1 回答
330 浏览

swift - 不同对象的 UITableViewDiffableDataSource 和 NSDiffableDataSourceSnapshot 只显示一行

我已经使用和喜欢实现了 UITableViewUITableViewDiffableDataSourceNSDiffableDataSourceSnapshot

在段更改时,更新 Wrapper 类型的数据。但问题是每次只显示一条记录。

感谢任何帮助,谢谢

0 投票
2 回答
599 浏览

ios - UICollectionViewDiffableDataSource 正在替换数据而不是更新

我试图理解UICollectionViewDiffableDataSourceNSDiffableDataSourceSnapshot

我在下面创建了一个非常粗略的版本。基本上在加载时它应该获取照片。

点击导航栏中的按钮,它会获取下一页。然而,这只是替换现有数据,我期望它将值附加到数组中。

请问我应该如何更新我的数据而不是替换它?

0 投票
0 回答
162 浏览

ios - 带有快照的现代 UI 集合视图 - 如何在不完全重新加载单元格的情况下更新单元格内容?

重复指控:

这个问题被错误地标记为我提出的另一个问题的重复。这里的这个问题是关于在不完全重新加载它的情况下向单元格传达更改(动态更改其内容而不是交叉淡入淡出到新的),而另一个是关于从单元格(到视图控制器)传递信息的结构方式因为单元格的内容现在被抽象掉了。这是两件不同的事情,因此这个问题不是重复的!请重新打开它。但是,我确实意识到这个问题并不像应该的那样清楚,这可能促成了这一事实,所以我已经更新了它。


iOS 14 引入了一种UICollectionViews通过 using 来处理和单元格的新方法UIContentConfiguration,它保存了单元格的数据(事实来源)。它的构建使单元格在数据更改时自动刷新。但它通过将其交叉淡入到新的单元格来刷新整个单元格。如果您想更好地控制更新动画,例如当名称更改时您只想更新该标签而不是整个单元格,该怎么办?

让我们看一个例子:你有一个显示name一个人和那个人的汽车的单元格。数据来自模型Person并加载到单元格中。将模型传递给单元的最简单方法是通过ItemIdentifier,例如:

这样,无论何时Person发生更改(例如carName更改),您都可以将新快照应用于数据源并更新单元格。但是,此更新作为单元格的新旧版本之间的交叉淡入淡出动画进行。如果你不想要那个怎么办?如果您希望单元格仅对汽车名称进行动画处理,例如,不“动画化”整个单元格(也就是“让单元格动画化以适应新数据”),该怎么办?使用这种方法是不可能的。

因此,为了防止Person更改重新加载整个单元格,您必须调整ItemIdentifier以不包括整个Person结构,而只包括其 id 或其他内容:

现在,只要 id 没有改变,cell 就不会重新加载,这是完美的,并且让 cell 有机会Person自行更新更改。但是,你是怎么做的?显然,单元格现在需要Person从其他地方获取数据,但是如何将更改传达Person给该单元格?

这就是我要问的问题。

我最近发布了一个与此相关的问题。Combine这是我在尝试使用发布者为单元提供更新来解决上述问题时遇到的“问题” :

NSDiffableSnapshot 导致 collectionview 的单元注册被重新调用,即使数据没有任何更改

(需要明确的是,这个问题也不是重复的。这是一个完全不同的问题,只是出于同一件事!)