我正在尝试筛选TableViewDiffableDataSource中的用户列表。过滤后的用户数组被传递给以下函数:
private func updateUserCell(_ users: Users? = nil) {
guard let newUsers = users else {
print("No users to show")
return
}
snapShot.deleteItems(viewModel.userList)
dataSource!.apply(snapShot, animatingDifferences: false)
if newUsers == [] { return }
var snapShot = dataSource?.snapshot()
snapShot?.appendItems(newUsers, toSection: .main)
dataSource!.apply(snapShot!, animatingDifferences: true)
}
调试显示用户在快照中得到了正确的附加。但是应用程序显示正确数量的过滤用户,但仅显示完整列表顶部的用户。
即,如果我有一个完整的用户列表[Cloe,Max,John,Martin]。正在搜索";jo"只显示克洛伊。正在搜索";ma";显示的是克洛伊和马克斯,而不是马克斯和马丁。
我不确定我是否完全理解您上述方法背后的逻辑,但除非我遗漏了代码片段中没有明确的内容,否则一种简单得多的方法似乎只是创建一个具有所需用户的新快照并应用它,而不是修改现有的快照。
private func updateUserCell(_ users: Users? = nil) {
guard let newUsers = users, !newUsers.isEmpty else {return}
var snapshot = NSDiffableDataSourceSnapshot<Section, User>()
snapshot.appendSections([.main])
snapshot.appendItems(newUsers, toSection: .main)
dataSource.apply(snapshot, animatingDifferences: true)
}
注:。拥有一个默认为nil的update-users方法并因此退出似乎是一个奇怪的设计选择。这表明,称之为它背后的逻辑有点扭曲。