使用 SwiftUI 中的列表和可识别协议使 ScrollViewReader 滚动到项目
Make ScrollViewReader scroll to item using a list and identifiable protocol in SwiftUI
我无法让 ScrollViewReader 在我的 List() 上滚动。我读过很多这样的讨论 or
我使用了一个带有 Identifiable 协议和 id 作为 Int 的模型:
struct Country: Identifiable, Codable, Hashable {
// database fields
var id: Int64?
var name: String
}
我目前的看法是这样的:
ScrollViewReader { proxy in
VStack {
Button(action: {
proxy.scrollTo(38) // just a test
})
{ Text("Jump to") }
List() {
ForEach(countries) { country in
Button (action: {
wine.countryId = country.id
// pop
self.mode.wrappedValue.dismiss()
}) {
// cell content
HStack {
Image(country.flag).resizable().frame(width: 24.0, height: 24.0)
Text(country.name)
}
}
//.id(country.id)
}
}
}
}
}
我尝试使用 .id()
来识别每个 row/button,但也没有成功。我不知道是否需要id()
因为ForEach()
使用国家的可识别协议来识别每个项目。
一件重要的事情:国家不是按照其 var id 的逻辑顺序 (1,2,3...) 显示的。但即使使用 id(country.id)
修饰符,它也永远不会滚动到列表的右侧 row/button。
我们可以在网上找到的大多数示例都对行使用简单的索引迭代,而不是使用 struct() 的真实模型。
匹配标识符的类型必须相同,因此您的 id
是 Optional
那么在 scrollTo
中它也应该是可选的,例如
Button(action: {
proxy.scrollTo(Optional(Int64(38))) // << here !!
})
在 Xcode 13 / iOS 15
上使用您复制的快照进行了测试
我无法让 ScrollViewReader 在我的 List() 上滚动。我读过很多这样的讨论
我使用了一个带有 Identifiable 协议和 id 作为 Int 的模型:
struct Country: Identifiable, Codable, Hashable {
// database fields
var id: Int64?
var name: String
}
我目前的看法是这样的:
ScrollViewReader { proxy in
VStack {
Button(action: {
proxy.scrollTo(38) // just a test
})
{ Text("Jump to") }
List() {
ForEach(countries) { country in
Button (action: {
wine.countryId = country.id
// pop
self.mode.wrappedValue.dismiss()
}) {
// cell content
HStack {
Image(country.flag).resizable().frame(width: 24.0, height: 24.0)
Text(country.name)
}
}
//.id(country.id)
}
}
}
}
}
我尝试使用 .id()
来识别每个 row/button,但也没有成功。我不知道是否需要id()
因为ForEach()
使用国家的可识别协议来识别每个项目。
一件重要的事情:国家不是按照其 var id 的逻辑顺序 (1,2,3...) 显示的。但即使使用 id(country.id)
修饰符,它也永远不会滚动到列表的右侧 row/button。
我们可以在网上找到的大多数示例都对行使用简单的索引迭代,而不是使用 struct() 的真实模型。
匹配标识符的类型必须相同,因此您的 id
是 Optional
那么在 scrollTo
中它也应该是可选的,例如
Button(action: {
proxy.scrollTo(Optional(Int64(38))) // << here !!
})
在 Xcode 13 / iOS 15
上使用您复制的快照进行了测试