我正在做一个选择器。当我将
@State length
设置为可选时,它不起作用。我无法选择任何选项。
当我将
@State length
设置为 Double 时,它可以正常工作。但它与另一个选择器相关联。我希望 length
可以什么都不是,当另一个选择器给出一些选项时。
//this is DiskLock
struct DiskLock: Identifiable {
var name: DiskLockName
var length: Double?
var actualWeight: Double?
var id: Int
enum DiskLockName: String, CaseIterable, Identifiable {
case standard
case ledger
case diagonalBrace
case headJack
case baseJack
var id: Self { self }
}
}
// two pickers
struct EditDiskLock: View {
@ObservedObject var diskLockViewModel: DiskLockViewModel
@Environment(\.presentationMode) var presentationMode
var lengths = [0.6, 0.9, 1.2, 0.2, 0.35, 0.5, 1, 1.5, 2, 2.5, 1.61, 1.71, 1.86]
var body: some View {
VStack {
Form {
editDiskLockNameSection
editDiskLockLengthSection
editDiskLockActualWeightSection
}
addDiskLockButton
Spacer()
}
}
//selectedDiskLockName
@State var selectedDiskLockName: DiskLock.DiskLockName = .baseJack
var editDiskLockNameSection: some View {
List {
Picker("DiskLockName", selection: $selectedDiskLockName) {
ForEach(DiskLock.DiskLockName.allCases) { diskLockName in
Text(diskLockName.rawValue)
}
}.pickerStyle(.segmented)
}
}
//editDiskLockLengthSection
@State var selectedDiskLockLength: Double = 0.3 // **i want set this to optional**
var editDiskLockLengthSection: some View {
List {
Picker("DiskLockLength", selection: $selectedDiskLockLength) {
if selectedDiskLockName == .standard {
ForEach(lengths[3...9], id: \.self) { length in
Text(String(length))
}
}
if selectedDiskLockName == .ledger {
ForEach(lengths[0...2], id: \.self) { length in
Text(String(length))
}
}
if selectedDiskLockName == .diagonalBrace {
ForEach(lengths[10...12], id: \.self) { length in
Text(String(length))
}
}
}
.pickerStyle(.segmented)
}
}
//editDiskLockActualWeightSection
@State var actualWeight = ""
var editDiskLockActualWeightSection: some View {
Section(header: Text("DiskLockActualWeight")) {
TextField("DiskLockActualWeight", text: $actualWeight)
}
}
//addDiskLockButton
var addDiskLockButton: some View {
Button("add") {
if selectedDiskLockName == .baseJack || selectedDiskLockName == .headJack {
diskLockViewModel.addNewDiskLock(name: selectedDiskLockName, length: nil, actualWight: Double(actualWeight))
} else {
diskLockViewModel.addNewDiskLock(name: selectedDiskLockName, length: selectedDiskLockLength, actualWight: Double(actualWeight))
}
presentationMode.wrappedValue.dismiss()
print("\(diskLockViewModel.diskLocks)")
}.disabled(selectedDiskLockLength == 0.3)
}
}
在数组中取一个 nil 值。
var lengths = [nil, 0.6, 0.9, 1.2, 0.2, 0.35, 0.5, 1, 1.5, 2, 2.5, 1.61, 1.71, 1.86]
并给Text(String(length ?? 0.0))
默认值
我认为 Picker 没有更新可选值,这可能是因为选择值没有正确设置为 nil。