SwiftUI:当用户在第一个 ScrollView 中点击该项目时,在特定索引处加载第二个 ScrollView

Posted

技术标签:

【中文标题】SwiftUI:当用户在第一个 ScrollView 中点击该项目时,在特定索引处加载第二个 ScrollView【英文标题】:SwiftUI: loading a 2nd ScrollView at a specific index when the user tapped on that item in the 1st ScrollView 【发布时间】:2020-04-15 05:11:30 【问题描述】:

场景是,当用户在第一个 ScrollView 中点击该索引项时,在特定索引处加载第二个 ScrollView。

Aka,在第一个图像列表中选择一个图像,然后打开第二个图像列表,所选索引图像全屏显示。

如何在 SwiftUI 中做到这一点?

///这里是代码。

private struct ImageList: View 
    var images: [ImageViewModel]
    @State private var showSheet = false
    @State private var selectedImage = ImageViewModel.default

    var body: some View 

        VStack(alignment: .leading) 
            Text("Images")
                .font(.headline)
            ScrollView(.horizontal) 
                HStack(alignment: .top, spacing: 6) 
                    ForEach(images, id: \.self)  image in
                        KFImage(source: .network(image.fileURL))
                            .resizable()
                            .frame(width: 200)
                            .aspectRatio(1.77, contentMode: .fit)
                            .onTapGesture 
                                self.selectedImage = image
                                self.showSheet.toggle()
                        
                    
                .sheet(isPresented: $showSheet) 
                    PresentedImageList(images: self.images)
                
            .frame(height: 120)
        
        .padding(.horizontal).padding(.bottom)
    


private struct PresentedImageList: View 
    var images: [ImageViewModel]

    var body: some View 

        GeometryReader  gr in
            ScrollView(.horizontal, showsIndicators: false) 
                HStack(alignment: .top, spacing: 6) 
                    ForEach(self.images, id: \.self)  image in
                        KFImage(source: .network(image.fileURL))
                            .resizable()
                            .frame(width: gr.size.width)
                            .aspectRatio(1.77, contentMode: .fit)

                    
                
            .background(Color.black)
        

    

【问题讨论】:

【参考方案1】:

您需要将图像(名称/id)传递给工作表,然后使用工作表中的信息来显示按下的图像。详细答案可以在here找到。

【讨论】:

好吧,传递给工作表的数据是一个图像数组/列表,但在我的问题中不是单个图像。我想要的是用工作表模式呈现水平滚动图像列表,但起始图像应该是点击的。 您可以在 PresentedImageList 视图中添加一个额外的变量,这样您就可以传递数组和图像 ID 信息,例如:PresentedImageList(images: images, imageID: image.id) 是的,我可以这样做,你是对的。但是现在阻碍我的主要事情是如何在呈现的图像列表中显示选定的图像。请记住,它是ForEach loop,默认情况下,它从索引 0 开始。一种想法是设置 ForEach 从点击的索引项开始,但我仍然需要向左滚动。【参考方案2】:

我找到了解决方案,并将其更新到我的another post。 简单地说,我使用的是 UIPageView 而不是 UIScrollView。并将主视图的索引发送到 PageView 的 @State。并在PageView的init()中设置@State值。

【讨论】:

以上是关于SwiftUI:当用户在第一个 ScrollView 中点击该项目时,在特定索引处加载第二个 ScrollView的主要内容,如果未能解决你的问题,请参考以下文章

清除按钮按下swiftui时如何自动上一个文本字段

如何在 SwiftUI 中一个接一个地显示多个警报对话框?

Swiftui foreach 索引超出范围 ondelete 问题

SwiftUI TabView 如何在第二个选项卡单击时加载更多数据

SwiftUI - 当用户打开推送通知时打开特定视图

如果新用户注册成功,如何打开一个屏幕,当现有用户使用 SwiftUI 成功登录时如何打开另一个屏幕?