使用 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() 的真实模型。

匹配标识符的类型必须相同,因此您的 idOptional 那么在 scrollTo 中它也应该是可选的,例如

Button(action: {
   proxy.scrollTo(Optional(Int64(38))) // << here !!
})

在 Xcode 13 / iOS 15

上使用您复制的快照进行了测试