【问题标题】:SwiftUI - trying to identify and pass the value of the list item being selectedSwiftUI - 尝试识别并传递被选中的列表项的值
【发布时间】:2020-10-14 03:02:05
【问题描述】:

我正在关注interfacing with UIKIt 上的 Apple Developer 教程

唯一真正的区别是我正在尝试调用

PageView<Page:View> { 

来自 NavigationLink。 PageView 中的示例代码具有硬编码的默认值

@State var currentPage = 0 

我宁愿在用户选择的视图上启动滑动过程,而不是从第一个开始,我正在尝试创建一种简单的方法来滑动浏览项目,而无需返回导航链接来访问列表中的下一项。

有没有办法捕获用户选择的链接的索引并将其作为变量传递给 PageView。

我尝试增加一个计数器并使用一个函数来增加计数器并返回 PageView sruct,但没有任何成功。 Animals 是一个数组,以防万一不清楚,我正在使用 map 函数传入适当的值来创建我要创建的详细视图。另外,我意识到我可以将详细视图放在滚动视图中。

这是我的代码

var body: some View {
    List {
        ForEach(collection.animals, id: \.self) { animal in
            NavigationLink(destination:PageView(self.collection.animals.map { AnimalDetail(animalMetadata: $0.wrappedMetadata  )})) {
            AnimalRow(thumbnailImage: Image(uiImage: UIImage(data: animal.image!)!), label: (animal.name!) ).font(.subheadline)
            
         }
    }.onDelete(perform: delete)
}

其他一切似乎都工作正常 - 只是想不出一种方法来从列表中捕获索引值以指示单击了哪个项目/视图并将该值传递给 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: $0.wrappedMetadata)} )) {
            AnimalRow(thumbnailImage: Image(uiImage: UIImage(data: item.image!)!), label: (animal.name!) ).font(.subheadline)
                
    }
}.onDelete(perform: delete)

【问题讨论】:

    标签: foreach swiftui uipageviewcontroller swiftui-list swiftui-navigationlink


    【解决方案1】:

    试试下面...

    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: $0) }
        }
    
        // ... 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: $0.wrappedMetadata  )}, 
                      selection: idx)) {     // << here !!
    
                  AnimalRowRow(thumbnailImage: Image(uiImage: UIImage(data: animal.image!)!), 
                      label: (animal.name!) ).font(.subheadline)
                
             }
        }.onDelete(perform: delete)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-23
      • 2019-05-31
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      相关资源
      最近更新 更多