SwiftUI - 尝试识别并传递被选中的列表项的值
SwiftUI - trying to identify and pass the value of the list item being selected
我正在关注 interfacing with UIKIt
上的 Apple Developer 教程
唯一真正的区别是我正在尝试调用
PageView<Page:View> {
来自 NavigationLink。 PageView 中的示例代码具有硬编码的默认值
@State var currentPage = 0
我宁愿在用户选择的视图上启动滑动过程,而不是从第一个视图开始,我正在尝试创建一种简单的方式来滑动项目而不必 return转到导航link 以访问列表中的下一项。
有没有办法捕获用户选择的 link 的索引并将其作为变量传递给 PageView。
我曾尝试递增计数器并使用函数递增计数器和 return PageView 结构,但均未成功。
animals 是一个数组,以防万一不清楚,我正在使用 map 函数传递适当的值来创建我要创建的详细视图。另外,我意识到我可以将详细视图放在滚动视图中。
这是我的代码
var body: some View {
List {
ForEach(collection.animals, id: \.self) { animal in
NavigationLink(destination:PageView(self.collection.animals.map { AnimalDetail(animalMetadata: [=12=].wrappedMetadata )})) {
AnimalRow(thumbnailImage: Image(uiImage: UIImage(data: animal.image!)!), label: (animal.name!) ).font(.subheadline)
}
}.onDelete(perform: delete)
}
其他一切似乎都正常 - 只是想不出一种方法来从列表中捕获索引值以指示单击了哪个 item/view 并将该值传递给 PageView 以创建此作为第一个查看的视图。
谢谢!
编辑
我尝试在 Array 上使用 .enumerated() 但仍然无法弄清楚如何将特定索引值获取到 PAgeView 视图。
List {
ForEach(Array(collection.animals.enumerated()), id: \.1.id) {index, item in
NavigationLink(destination:PageView( self.collection.animals.map { AnimalDetail(animalMetadata: [=13=].wrappedMetadata)} )) {
AnimalRow(thumbnailImage: Image(uiImage: UIImage(data: item.image!)!), label: (animal.name!) ).font(.subheadline)
}
}.onDelete(perform: delete)
尝试以下...
在PageView
中:
struct PageView<Page: View>: View {
var viewControllers: [UIHostingController<Page>]
@State var currentPage: Int // no initial value
init(_ views: [Page], selection: Int) {
_currentPage = State(initialValue: selection)
self.viewControllers = views.map { UIHostingController(rootView: [=10=]) }
}
// ... other code here
}
在您的代码中:
var body: some View {
List {
ForEach(Array(collection.animals.enumerated()), id: \.element) { idx, animal in
NavigationLink(destination:
PageView(self.collection.animals.map {
AnimalDetail(animalMetadata: [=11=].wrappedMetadata )},
selection: idx)) { // << here !!
AnimalRowRow(thumbnailImage: Image(uiImage: UIImage(data: animal.image!)!),
label: (animal.name!) ).font(.subheadline)
}
}.onDelete(perform: delete)
}
我正在关注 interfacing with UIKIt
上的 Apple Developer 教程唯一真正的区别是我正在尝试调用
PageView<Page:View> {
来自 NavigationLink。 PageView 中的示例代码具有硬编码的默认值
@State var currentPage = 0
我宁愿在用户选择的视图上启动滑动过程,而不是从第一个视图开始,我正在尝试创建一种简单的方式来滑动项目而不必 return转到导航link 以访问列表中的下一项。
有没有办法捕获用户选择的 link 的索引并将其作为变量传递给 PageView。
我曾尝试递增计数器并使用函数递增计数器和 return PageView 结构,但均未成功。 animals 是一个数组,以防万一不清楚,我正在使用 map 函数传递适当的值来创建我要创建的详细视图。另外,我意识到我可以将详细视图放在滚动视图中。
这是我的代码
var body: some View {
List {
ForEach(collection.animals, id: \.self) { animal in
NavigationLink(destination:PageView(self.collection.animals.map { AnimalDetail(animalMetadata: [=12=].wrappedMetadata )})) {
AnimalRow(thumbnailImage: Image(uiImage: UIImage(data: animal.image!)!), label: (animal.name!) ).font(.subheadline)
}
}.onDelete(perform: delete)
}
其他一切似乎都正常 - 只是想不出一种方法来从列表中捕获索引值以指示单击了哪个 item/view 并将该值传递给 PageView 以创建此作为第一个查看的视图。
谢谢!
编辑
我尝试在 Array 上使用 .enumerated() 但仍然无法弄清楚如何将特定索引值获取到 PAgeView 视图。
List {
ForEach(Array(collection.animals.enumerated()), id: \.1.id) {index, item in
NavigationLink(destination:PageView( self.collection.animals.map { AnimalDetail(animalMetadata: [=13=].wrappedMetadata)} )) {
AnimalRow(thumbnailImage: Image(uiImage: UIImage(data: item.image!)!), label: (animal.name!) ).font(.subheadline)
}
}.onDelete(perform: delete)
尝试以下...
在PageView
中:
struct PageView<Page: View>: View {
var viewControllers: [UIHostingController<Page>]
@State var currentPage: Int // no initial value
init(_ views: [Page], selection: Int) {
_currentPage = State(initialValue: selection)
self.viewControllers = views.map { UIHostingController(rootView: [=10=]) }
}
// ... other code here
}
在您的代码中:
var body: some View {
List {
ForEach(Array(collection.animals.enumerated()), id: \.element) { idx, animal in
NavigationLink(destination:
PageView(self.collection.animals.map {
AnimalDetail(animalMetadata: [=11=].wrappedMetadata )},
selection: idx)) { // << here !!
AnimalRowRow(thumbnailImage: Image(uiImage: UIImage(data: animal.image!)!),
label: (animal.name!) ).font(.subheadline)
}
}.onDelete(perform: delete)
}