SwiftUI-如何使用OnTap手势在ScrollView中仅初始化一个截面视图

SwiftUI-如何使用OnTap手势在ScrollView中仅初始化一个截面视图,swiftui,Swiftui,我的问题是,当用户在我的ScrollView中按下项目时,所有的SectionView项目都会更改。我想做的是只更改一项。我试图在用户点击项目图像时更改项目图像,然后在用户点击另一个项目时恢复以前的项目图像并更改当前项目图像 请查看我的滚动视图: ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 15) { Fo

我的问题是,当用户在我的ScrollView中按下项目时,所有的SectionView项目都会更改。我想做的是只更改一项。我试图在用户点击项目图像时更改项目图像,然后在用户点击另一个项目时恢复以前的项目图像并更改当前项目图像

请查看我的滚动视图:

                ScrollView(.horizontal, showsIndicators: false) {
                HStack(spacing: 15) {
                    ForEach(1..<41) { item in
                        GeometryReader { geometry in
                            SectionView(number: item, pressed: pressed, firstElement: (item == 1) ? true : false)
                                .rotation3DEffect(Angle(degrees:
                                                            Double(geometry.frame(in: .global).minX - 30) / -20
                                ), axis: (x: 0, y: 10, z: 0))
                                
                                .onTapGesture {
                                    self.pressed.toggle()
                                    SectionView(number: item, pressed: self.pressed, firstElement: (item == 1) ? true : false)
                                    print("touched item \(item)")
                                }
                        })
                    }
                }
            }

我试图将您的代码置于某种可构建状态,但我无法使其编译或运行,因此我可能完全误解了您试图执行的操作。但是,在我看来,您使用的是
pressed
,就好像您正在捕捉按下该特定
截面视图时的状态一样。但是,它必须是一个状态变量才能编译,因此它将更新所有视图,我相信您会看到这一点。我认为您需要做的是将按下的
更改为一个Int,跟踪按下的
截面视图
,并将其与数字进行比较,该数字允许特定的
截面视图
跟踪其标识

此外,我认为您不希望在点击手势中显示
截面视图。我认为您只需要更改已按下变量的状态,让它在层次结构中工作

最后,这确实有助于展示。我知道这并不总是可能的,但从你问问题的方式来看,你实际上做了些什么,而不是你想要的

struct SectionView: View {
var number: Int
var pressed: Bool
var firstElement: Bool

var body: some View {
    ZStack(alignment: .bottom) {
        Image(pressed ? "t1" : "t\(number)")
            .resizable()
            .frame(maxWidth: .infinity)
            .frame(maxHeight: .infinity)
            .aspectRatio(contentMode: .fill)
        
        Spacer()
        
        Text(firstElement ? "" : "Pride")
            .font(.system(size: 12, weight: .black))
            .foregroundColor(.white)
            .frame(maxWidth: .infinity, alignment: .center)
            .padding(.bottom, 15)
    }
    .frame(width: 60, height: 80)
    //.background(section.image)
    .cornerRadius(7)
    //.shadow(color: section.image.opacity(0.15), radius: 8, x: 0, y: 10)
}
}