You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI问题:点击NavigationLink时List列表项临时下移

解决List点击NavigationLink临时下移的问题

问题根源:你在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:33:16