选择器选择与解码的 Json 河流数据不匹配

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

我正在构建一个快速应用程序,并尝试在菜单选择器中为不同的河流提供一系列选项。目前,我遇到的问题是,当打开应用程序后第一次选择不同的河流时,它会获取选择器选项的默认索引 (0) 的河流数据。

例如,当我打开应用程序时,豪斯谷是默认值,它可以正确找到河流的高度。但是,如果我选择另一个选项,它会使用 Howes Valley ID“212021”,而不是所选的 ID。

 let rivers: [River] = [
        River(id: "212021", name: "McDonald River @ Howes Valley"),
        River(id: "212461", name: "Hawkesbury River @ Leetsvale"),
        River(id: "212290", name: "Colo River @ Upper Colo")
    ]

**我尝试修改菜单选择器逻辑以选择菜单选择器的索引,但仍然存在问题。这是我的河流数据菜单选择器的代码 **

GroupBox(label: Label("River Data", systemImage: "waveform.path.ecg")
                .font(.title)
                .foregroundColor(.blue)
                .padding(.bottom, 8)
            ) {
                
                Picker(selection: $selectedRiverIndex, label: Text("Select a river")) {
                    ForEach(0..<rivers.count, id: \.self) { index in
                        Text(rivers[index].name)
                    }
                }
                .pickerStyle(MenuPickerStyle())
                .onChange(of: selectedRiverIndex) { newIndex, _ in
                    isLoading = true // Show loading indicator
                    Task {
                        let newRiverIndex = newIndex
                        await riverModel.fetchRiverHeightData(for: rivers[newRiverIndex].id)
                        isLoading = false // Hide loading indicator after data is fetched
                    }
                }
              
              // River data details view
                VStack(alignment: .leading, spacing: 8) {
                    ForEach(riverModel.riverData, id: \.time) { riverValue in
                        VStack(alignment: .leading) {
                            if let convertedDate = convertDateString(riverValue.time) {
                                Text("\(riverValue.v)m")
                                    .font(.headline)
                                Text("Last Updated:")
                                    .font(.subheadline)
                                    .foregroundColor(.secondary)
                                Text("\(convertedDate.date) at \(convertedDate.time)")
                                    .font(.subheadline)
                            }
                        }
                        .padding(.vertical, 4)
                    }
                }
            }`

**
Here is the code for default when opening the app:**
 // Fetch river details and river data when the view appears
`        
.onAppear {
            Task {
                let selectedRiverID = "212021" // Set the initial selected river ID
                await riverModel.fetchRiverHeightData(for: selectedRiverID)
                isLoading = false // Hide loading indicator after data is fetched
            }
            
        }
`

swift uipickerview
1个回答
0
投票

谢谢@workingdog

原来我需要在 onChange 中添加

newIndex

                .onChange(of: selectedRiverIndex) { oldIndex, newIndex in
                    isLoading = true
                    Task {
                        let newRiverIndex = newIndex
                        await riverModel.fetchRiverHeightData(for: rivers[newRiverIndex].id)
                        isLoading = false
                    }
                }
© www.soinside.com 2019 - 2024. All rights reserved.