SwiftUI问题:点击NavigationLink时List列表项临时下移
问题根源:你在ForEach中使用列表索引作为视图标识(id: \.self),还给SearchResultRow绑定了索引作为.id(i)。这种依赖索引的标识方式不稳定,当滚动列表后点击NavigationLink,SwiftUI会因为视图标识关联的位置变化,触发不必要的布局重计算,从而出现临时下移的跳动现象。
解决方案1:让数据模型遵循Identifiable协议
修改SearchResult模型,让它实现Identifiable协议,确保每个数据项拥有唯一且稳定的标识:
struct SearchResult: Identifiable { let id: UUID // 也可以用你数据中已有的唯一ID字段(比如服务器返回的id) // 模型原有字段 }
然后更新SearchView中的ForEach写法,直接遍历数据集合,无需手动指定索引:
ForEach(searchModel.results) { result in SearchResultRow(result) }
同时删除SearchResultRow后面的.id(i),因为ForEach会自动使用Identifiable协议的id作为视图标识。
解决方案2:手动指定稳定的标识(无法修改模型时)
如果不能修改SearchResult模型,就在ForEach中使用数据本身的唯一属性作为标识(假设模型有uniqueId字段):
ForEach(searchModel.results, id: \.uniqueId) { result in SearchResultRow(result) }
同样要移除.id(i),避免依赖不稳定的索引。
额外优化:统一导航标题设置
你当前在不同状态分支中重复设置.navigationTitle,可以将其移到NavigationStack的根层级,避免状态切换时的标题动画干扰布局:
NavigationStack { // 原有内容:ProgressView、无结果提示文本、List等分支 } .navigationTitle(SearchView.navTitle) // 统一设置在这里
内容的提问来源于stack exchange,提问作者MrWhetherMan
相关产品推荐
相关产品推荐

