为什么选择器不工作?当我设置 @State 是可选的时无法选择选项

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

我正在做一个选择器。当我将

@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)
    }
}
swiftui picker swift-optionals
1个回答
0
投票

在数组中取一个 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。

© www.soinside.com 2019 - 2024. All rights reserved.