我正在构建一个快速应用程序,并尝试在菜单选择器中为不同的河流提供一系列选项。目前,我遇到的问题是,当打开应用程序后第一次选择不同的河流时,它会获取选择器选项的默认索引 (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
}
}
`
谢谢@workingdog
原来我需要在 onChange 中添加
newIndex
.onChange(of: selectedRiverIndex) { oldIndex, newIndex in
isLoading = true
Task {
let newRiverIndex = newIndex
await riverModel.fetchRiverHeightData(for: rivers[newRiverIndex].id)
isLoading = false
}
}