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

scrollPosition不更新问题:$scrollPosition赋值异常且onChange未触发?

问题原因及解决方案

你的代码存在两个关键问题,导致scrollPosition无法正确赋值、onChange从未触发:

1. 缺少滚动行为配置

scrollPosition依赖视图对齐的滚动行为才能追踪位置变化,默认情况下List不会启用该行为。同时需确保scrollTargetLayout()作用于包含所有滚动项的容器(你的代码中位置正确,但缺失行为配置)。

2. List行ID关联不明确

虽然你给文本视图设置了.id(product.id),但List的行容器可能使用默认ID覆盖自定义设置,导致系统无法正确关联滚动项与追踪ID。

修改后的完整代码

@Model
final class Product {
    var name: String = ""
    var brand: String = ""
    
    init(name: String, brand: String) {
        self.name = name
        self.brand = brand
    }
}

struct ProductListView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var products: [Product]
    @State private var scrollPosition: Product.ID?
    
    var body: some View {
        NavigationStack {
            List {
                ForEach(products, id: \.id) { product in // 明确指定ID路径
                    Text(product.name)
                }
                .scrollTargetLayout()
            }
            .scrollTargetBehavior(.viewAligned) // 添加视图对齐的滚动行为
            .scrollPosition(id: $scrollPosition)
            .onChange(of: scrollPosition) { oldValue, newValue in
                print("scrollPosition changed from \(oldValue) to \(newValue)")
            }
        }
    }
}

额外注意事项

  • 确保项目运行在**iOS 17.0+**或对应版本的苹果系统上,scrollPosition与scrollTargetLayout()是iOS 17新增API。
  • 确认products数组非空,无数据时自然无法追踪滚动位置。
  • 滚动时需让列表项完全进入视图(达到对齐阈值),scrollPosition才会更新,轻微滚动可能不会触发回调。

内容的提问来源于stack exchange,提问作者chepiok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 19:12:08