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
相关产品推荐
相关产品推荐

