首页 > 解决方案 > 将数据从枚举传递到在 ForEach 循环内触发的工作表

问题描述

我的 VStack 中有一个 ForEach 循环,因此为我的枚举中的每个元素创建一个新的“单元格”。这工作得很好。我可以传递每个单元格的标题和编号,但在每个单元格中都有一个用于切换工作表视图的按钮。每个工作表都应在滚动视图中包含相应的文本。因此,该文本也在枚举中给出。

问题:但是当我尝试通过 element.infoText 为每个工作表传递该 infoText 时,会显示枚举中第一个元素的 infoText。

ForEach 循环:

struct ListView: View{

@State var infoSheetIsPresented: Bool = false

var body: some View{

    VStack {
        ForEach(WelcomeCardViewContent.allCases, id: \.self) {
        element in
            HStack {

                Text(element.text)

                Button(action: {
                        self.infoSheetIsPresented.toggle()
                    }) {
                        Image(systemName: "info.circle")
                    }
                    .sheet(isPresented: self.$infoSheetIsPresented) {
                        Text(element.infoText)
                    }
            }
        }
    }
}
}

这是我的枚举。当然还有 InfoSheetView,但就像我说的,它基本上只是一个带有文本的滚动视图。文本通过一个简单的“文本”常量传递。为简单起见,我用简单的文本视图替换了单独的工作表视图 - >同样的问题。

enum WelcomeCardViewContent: String, CaseIterable{

case personalData
case bodyParameters

var text: String {
    switch self{
    case .personalData:
        return "Personal Data"
    case .bodyParameters:
        return "Body Parameters"
    }
}

var infoText: String {
    switch self{
    case .personalData:
        return "1 Lorem ipsum dolor.."
    case .bodyParameters:
        return "2 Lorem ipsum dolor sit amet."
    }
}
}

谢谢你的建议^^。

标签: iosswiftforeachenumsswiftui

解决方案


由于您丢失了当前卡片的轨迹,因此我通过保存将要显示的卡片来解决此问题。现在文本显示正确。

这是固定版本:

struct ListView: View {

    @State private var infoSheetIsPresented: Bool = false
    @State private var showingCard: WelcomeCardViewContent = .personalData

    var body: some View {
        ForEach(WelcomeCardViewContent.allCases, id: \.self) { element in
            HStack {
                Text(element.text)

                Button(action: {
                    self.showingCard = element
                    self.infoSheetIsPresented.toggle()
                }) {
                    Image(systemName: "info.circle")
                }
                .sheet(isPresented: self.$infoSheetIsPresented) {
                    Text(self.showingCard.infoText)
                }
            }
        }
    }
}

推荐阅读