我的SwiftUI应用具有分段的选择器,我希望能够根据从网络调用中检索到的选项的可用性来禁用一个或多个选项。查看代码看起来像:
@State private var profileMetricSelection: Int = 0
private var profileMetrics: [RVStreamMetric] = [.speed, .heartRate, .cadence, .power, .altitude]
@State private var metricDisabled = [true, true, true, true, true]
var body: some View {
VStack(alignment: .leading, spacing: 2.0) {
...(some views)...
Picker(selection: $profileMetricSelection, label: Text("")) {
ForEach(0 ..< profileMetrics.count) { index in
Text(self.profileMetrics[index].shortName).tag(index)
}
}.pickerStyle(SegmentedPickerStyle())
...(some more views)...
}
}
我想做的是根据网络数据修改metricDisabled
数组,以便重新绘制视图以启用相关段。在UIKit中,可以通过调用UISegmentedControl上的setEnabled(_:forSegmentAt:)
来完成,但我找不到使用SwiftUI Picker进行此操作的方法
[我知道我可以将UISegmentedControl包装在UIViewRepresentable中,但是在此之前我只是想检查我是否没有丢失任何东西...
您可以使用此简单技巧
import SwiftUI
struct ContentView: View {
@State var selection = 0
let data = [1, 2, 3, 4, 5]
let disabled = [2, 3] // at index 2, 3
var body: some View {
let binding = Binding<Int>(get: {
self.selection
}) { (i) in
if self.disabled.contains(i) {} else {
self.selection = i
}
}
return VStack {
Picker(selection: binding, label: Text("label")) {
ForEach(0 ..< data.count) { (i) in
Text("\(self.data[i])")
}
}.pickerStyle(SegmentedPickerStyle())
Spacer()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
也许像
ForEach(0 ..< data.count) { (i) in
if !self.disabled.contains(i) {
Text("\(self.data[i])")
} else {
Spacer()
}
}
可以帮助更好地可视化它
注意(基于讨论)
从用户的角度来看,Picker是一个控件,可以处于禁用/启用状态。
从选择器中选择的选项不受控制,这是一些值。如果列出了呈现给用户的控件列表,则可以禁用其中的某些控件,只是为了通知用户与该控件关联的操作当前不可用(例如菜单,某些按钮集合等)
我建议您在选择器中仅显示可以选择的值。此值集合可以随时更新。