gpt4 book ai didi

objective-c - 如何在不删除和插入 UITableViewDiffableDataSource 的情况下重新加载项目?

转载 作者:行者123 更新时间:2023-12-02 11:16:40 44 4
gpt4 key购买 nike

我正在使用 UITableViewDiffableDataSource 在我的应用程序中实现搜索屏幕.每个单元格代表一个搜索命中并在单元格标题中突出显示搜索匹配,有点像 Xcode 的 Open Quickly 窗口突出显示其结果项的部分。在搜索字段中输入文本时,我更新了结果列表。结果随着相关性的变化在列表中上下移动。

诀窍是每次搜索文本更改时我都需要强制每个单元格重新呈现,因为新的搜索字符串意味着更新单元格标题的突出显示部分。但我不想动画删除和插入,因为它仍然是同一个项目。如何使用快照告诉数据源它需要重新加载单元格?

我这样声明数据源:

@property (retain) UITableViewDiffableDataSource<NSString *, SearchHit *> *dataSource;
SearchHit代表一个搜索结果;它具有显示标题和要在标题中突出显示的范围数组的属性。它覆盖 hashisEqual:这样每个结果行都是唯一标识的。

我的代码看起来像这样:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
NSArray<SearchHit *> *hits = [self fetchHits:searchText];
NSDiffableDataSourceSnapshot<NSString *, SearchHit *> *snap = [[[NSDiffableDataSourceSnapshot alloc] init] autorelease];
[snap appendSectionsWithIdentifiers:@[@""]];
[snap appendItemsWithIdentifiers:hits];
[snap reloadItemsWithIdentifiers:hits];
[self.dataSource applySnapshot:snap animatingDifferences:YES];
}

起初我没有 reloadItemsWithIdentifiers在那里调用,然后一旦它出现在结果列表中,任何单元格都不会改变。添加 reload调用帮助,但现在大多数单元格都在不断更新。这在我的代码中的某处闻起来像是逻辑错误,但我已经验证传递给快照的命中是正确的,而传递给数据源的单元格创建回调的命中不是。

This article通过唐尼沃尔斯和 this related Twitter thread Steve Breen 建议解决此问题的方法是使项目标识符类型仅表示显示单元格所需的属性。所以我更新了 SearchHit的散列和相等比较以包括标题的突出显示部分,他们以前没有。然后我在每次更新时删除并插入所有单元格的动画,这是我不想要的。

这好像是什么 reloadItemsWithIdentifiers应该做...对吗?

示例项目 here在 GitHub 上。

最佳答案

diffable 数据源 API 可能不是在单元格本身上影响动画的正确工具。它面向单元格的出现、消失和排序的动画。如果您的数据源具有通过 Hashable 一致性表示的更改,则 api 会将其视为更改并删除/插入等。

我的建议是从项目标识符中删除搜索文本,并让每个单元格观察搜索文本并独立于数据源实现动画或重绘。

关于objective-c - 如何在不删除和插入 UITableViewDiffableDataSource 的情况下重新加载项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60620906/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com