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

SwiftUI中CoreData FetchedResults填充的List滚动失效问题求解

问题原因

  • 你调用proxy.scrollTo(10, anchor: .top)传入的是Int类型的下标值10,但ForEach(items)默认使用Core Data的Item实体对象本身的唯一标识作为匹配id,两者类型不匹配,完全找不到对应元素,所以滚动没有响应。
  • 当你用普通数组Array(0...100)时,元素本身就是Int类型,和你传入的10类型一致、值匹配,所以能正常滚动。

解决方法

你可以选择以下任意一种方案修改代码:

方案1:显式绑定下标作为id

在ForEach中显式指定元素的id为数组下标,滚动时传入对应下标即可:

private var items: FetchedResults<Item>

NavigationView {
    ScrollViewReader { proxy in
        List{
            // 显式用下标作为id
            ForEach(items.indices, id: \.self) { index in
                Text(items[index].text!)
                    .id(index)
            }
        }
        Button("Tap to scroll") {
            // 此时传入下标就能匹配到对应元素
            proxy.scrollTo(10, anchor: .top)
        }
    }
}

方案2:用Item实体的唯一属性作为id

如果你的Item实体有唯一的属性(比如自带的objectID,或者你自定义的id字段),直接用这个属性作为id匹配即可:

NavigationView {
    ScrollViewReader { proxy in
        List{
            ForEach(items) { item in
                Text(item.text!)
                    .id(item.objectID)
            }
        }
        Button("Tap to scroll to 10th item") {
            // 滚动时传入第10个元素的objectID
            proxy.scrollTo(items[10].objectID, anchor: .top)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:15:09