在按数组详细列出的列表中创建指定数量的项目

问题描述 投票:0回答:1

我想在一个视图上输入一些详细信息。

单击按钮“我们走吧”

它带我进入下一个视图。在下一个视图中,我将传递一些此信息并进行一些计算。

简单的部分。好的。现在对我来说最困难的部分。

你可以看到我进入了“5”号看台。我希望列表中的项目显示“第 1 号站、第 2 号站...直至第 5 号站”。然后我需要按“id”拉出列表项,并根据我稍后在文本字段中输入的内容计算一些内容,但正确现在这让我发疯。

代码: 数组:

struct Stand: Codable, Identifiable, Hashable {
    var id = UUID()
    let stand: String
    var area: String
    var speed: Int
    var rf: Int
}

图像“图像 2”的代码:

struct Speeds1View: View {
    let title: String
    let productArea: String
    let noStands: String
    let billetArea: String
    @Environment(\.dismiss) var dismiss

    var standCount: Int {
        let sc = Int(noStands) ?? 0
        return sc
    }
    @State private var stand = [Stand]()
    @State var txtspeedCurrent: String
    @State private var rF = ""
    @State private var standNo: Int = 0
    @State private var rFCalculated: Int = 0

    var body: some View {
        NavigationStack{
                ZStack{
                    List{
                        HStack(alignment: .center){
                            Spacer()
                        VStack(){
                                Text("# of Stands")
                                Text(self.noStands)
                                Text("Billet Area")
                                Text(self.billetArea)
                                Text("Product Area")
                                Text(self.productArea)
                                Text(" Reduction Ratio: \(RedRatio) : 1")
                                Text("Testing")
                                Text(" Ave. Area Red: \(AveAreaRed)%")
                            }
                            Spacer()
                        }
                        ForEach(0..<standCount, id: \.self) { standCount in
                            StandRowView(stand: "1", speedCurrent: $txtspeedCurrent, rfactor: rF)
                        }
                        .padding(.horizontal)
                        .listRowInsets(EdgeInsets())
                        .listRowSeparator(.hidden)
                    }
                }
                        .onAppear(){
                            standList()
                        }
        }
        .navigationBarTitleDisplayMode(.inline)
        .navigationTitle("Calculate Area, \(title)")
    }

    private func standList(){
        self.standNo += 1
        
        let u = Stand(id: UUID(), stand: "\(standNo)", area: "Area: \(1)", speed: 8, rf: rFCalculated)
        self.stand.append(u)
    }
}
arrays list swiftui arraylist dynamic-list
1个回答
0
投票

我看到这个问题已经在评论中得到了回答,但为了完整起见,我添加了一个答案。 Benzy Neez 是正确的,问题是当您应该传入与实际

stand: "1"
循环相关的内容(例如
ForEach
)时,您却传入了
stand: "\(standCount + 1)"
。这是一个小小的挑剔,但如果您希望每个摊位根据其数量而独一无二,您可能应该使用摊位的编号作为 ID,如下所示:

struct Stand: Codable, Identifiable, Hashable {
    var id: String {
        return self.stand
    }

    let stand: String
    var area: String
    var speed: Int
    var rf: Int
}

这将允许您使用展位的编号作为其 ID。如果结构体的属性想要唯一,那么最好使用结构体的属性作为 ID,而不是在已存储的唯一变量之外创建 UUID。

另一个建议,考虑创建一个 ViewModel 对象并使用

@StateObject
,而不是在状态中存储许多单独的对象。

struct SpeedsViewModel {
    var stand = [Stand]()
    var txtspeedCurrent: String
    var rF = ""
    var standNo: Int = 0
    var rFCalculated: Int = 0
}

// ...

struct Speeds1View: View {
    // ...
    @StateObject viewModel: SpeedsViewModel
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.