NSCollectionViewDiffableDataSource中的附加部分

我正在尝试使用NSCollectionViewNSCollectionViewDiffableDataSource创建具有动态数目的节的NSCollectionViewCompositionalLayout

收集视图用于显示搜索结果,部分的数量取决于找到的结果的类型和数量。每个部分使用不同的布局显示其内容类型。

数据源被声明为NSCollectionViewDiffableDataSource<String,SearchResult>,其中SearchResult是使用Hashable实现UUID()的类。结果为零的部分不是空的,而是在集合视图中不存在。

显示视图控制器后,我会清除现有搜索结果:

func clearSearchResults(animate: Bool) {
    let snapshot = NSDiffableDataSourcesnapshot<String,SearchResult>()
    dataSource.apply(snapshot,animatingDifferences: animate)
}

当执行搜索时,我尝试为找到的每种结果类型在收集视图中添加一个部分:

// Code that performs the search
var snapshot = NSDiffableDataSourcesnapshot<String,SearchResult>()

// If I append more than one section an exception is thrown in apply():
// snapshot.appendSections([ViewController.trackSection,ViewController.albumSection])

snapshot.appendSections([ViewController.trackSection])
snapshot.appendItems(tracks,toSection: ViewController.trackSection)

// This also causes an exception in apply():
// snapshot.appendSections([ViewController.albumSection])
// snapshot.appendItems(albums,toSection: ViewController.albumSection)

dataSource.apply(snapshot,animatingDifferences: true)

堆栈跟踪为:

2019-11-10 13:34:29.883728-0600 DiffableTest[64931:1820050] [General] An uncaught exception was raised
2019-11-10 13:34:29.883813-0600 DiffableTest[64931:1820050] [General] -[NSCollectionView insertSections:] Section index 1 out of bounds
2019-11-10 13:34:29.883937-0600 DiffableTest[64931:1820050] [General] (
    0   CoreFoundation                      0x00007fff33a98f53 __exceptionPreprocess + 250
    1   libobjc.A.dylib                     0x00007fff69b5e835 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff33a98da9 +[NSException raise:format:] + 189
    3   UIFoundation                        0x00007fff6469fd5b -[_NSCollectionViewCore insertSections:] + 267
    4   UIFoundation                        0x00007fff6465dd5e -[_NSDiffableDataSourceViewUpdater _performNSCollectionViewInsertUpdate:] + 222
    5   UIFoundation                        0x00007fff6465db33 -[_NSDiffableDataSourceViewUpdater _performViewUpdates:] + 594
    6   AppKit                              0x00007fff3156d8e8 __58-[NSCollectionView performBatchUpdates:completionHandler:]_block_invoke + 21
    7   UIFoundation                        0x00007fff646aabe5 -[_NSCollectionViewCore _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:animator:] + 323
    8   UIFoundation                        0x00007fff646aaa7f -[_NSCollectionViewCore _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:] + 90
    9   UIFoundation                        0x00007fff646aaa02 -[_NSCollectionViewCore _performBatchUpdates:completion:invalidationContext:] + 74
    10  UIFoundation                        0x00007fff646aa957 -[_NSCollectionViewCore performBatchUpdates:completion:] + 53
    11  AppKit                              0x00007fff3156d7f4 -[NSCollectionView performBatchUpdates:completionHandler:] + 282
    12  UIFoundation                        0x00007fff6465d2ee -[_NSDiffableDataSourceViewUpdater _performUpdateWithCollectionViewUpdateItems:dataSourcesnapshotter:updateHandler:completion:] + 528
    13  UIFoundation                        0x00007fff646c72a2 -[__NSDiffableDataSource _commitNewDataSource:withViewUpdates:completion:] + 265
    14  UIFoundation                        0x00007fff646c1cb9 __66-[__NSDiffableDataSource applyDifferencesFromsnapshot:completion:]_block_invoke.259 + 190
    15  UIFoundation                        0x00007fff646c1fd2 __66-[__NSDiffableDataSource applyDifferencesFromsnapshot:completion:]_block_invoke.284 + 170
    16  libdispatch.dylib                   0x000000010039e78f _dispatch_client_callout + 8
    17  libdispatch.dylib                   0x00000001003af4cb _dispatch_lane_barrier_sync_invoke_and_complete + 135
    18  UIFoundation                        0x00007fff646c172d -[__NSDiffableDataSource applyDifferencesFromsnapshot:completion:] + 842
    19  UIFoundation                        0x00007fff64765417 +[_NSUIAnimator performWithAnimation:] + 90
    20  UIFoundation                        0x00007fff646c2939 -[__NSDiffableDataSource applyDifferencesFromsnapshot:animatingDifferences:completion:] + 158
    21  libswiftAppKit.dylib                0x00007fff6a2f6bb3 $s6AppKit34NSCollectionViewDiffableDataSourceC5apply_20animatingDifferences10completionyAA010NSDiffablefG8snapshotVyxq_G_SbyycSgtF + 211
    22  DiffableTest                        0x0000000100005c73 $s12DiffableTest14ViewControllerC13performSearchyyyXlSgF + 3059

我是否以某种方式滥用了API?

有关示例项目,请参见https://github.com/sbooth/DiffableTest

Loewe2658 回答:NSCollectionViewDiffableDataSource中的附加部分

我发现有时有必要两次调用apply(_:animatingDifferences:),一次是用动画appendSection(_:)调用false之后,一次是调用{{1}之后}。

例如:

appendItems(_:)

enter image description here

,

macOS 11中似乎解决了与NSCollectionViewDiffableDataSource相关的一些错误。在macOS 10.15。*中崩溃的动画应用快照似乎在大多数情况下都适用于macOS 11。

,

我自己遇到了令人困扰的问题。唯一可靠的解决方法是在应用快照之前使布局无效。

if snapshot.sectionIdentifiers.isEmpty {
    collectionView.collectionViewLayout.invalidateLayout()
}

dataSource.apply(snapshot,...)
本文链接:https://www.f2er.com/3127844.html

大家都在问