表单中的 SwiftUI 选择器无法正常工作

SwiftUI picker in Form not working properly

我正在为这种奇怪的选择器行为而苦恼。基本上,当我点击选择器行时,我可以看到选项,但每次我点击一行时,什么也没有发生。没有复选标记,没有返回到上一个视图,也没有选择。我也尝试在 ForEach 中添加 id: \.self,但没有任何变化。我正在使用 iOS 15 和 Xcode 13,但问题也出现在 iOS 14 和 Xcode 12.x 上。 这是我的视图代码:


@State private var month: Month?
@State private var category: Category?

var body: some View {
    NavigationView {
        VStack {
            Form {
                Section {
                    Picker(month?.name ?? "Seleziona il mese", selection: $month) {
                        ForEach(model.months) { month in
                            Text(month.name).tag(month)
                        }
                    }
                    Picker(category?.name ?? "Seleziona la categoria", selection: $category) {
                        ForEach(model.categories) { category in
                            Text(category.name).tag(category)
                        }
                    }
                }
            }
            Spacer()
        }
        .navigationTitle("Aggiungi Spesa")
    }
}

下面是Month的代码(Category基本一样):

class Month: Decodable, AirtableRecord, Identifiable {
    
    var id: String
    var createdTime: String
    var number: Int
    var name: String
    var completeName: String
    
    init(
        id: String,
        createdTime: String,
        number: Int,
        name: String,
        completeName: String) {
        
        self.id = id
        self.createdTime = createdTime
        self.number = number
        self.name = name
        self.completeName = completeName
    }
    
    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(String.self, forKey: .id)
        createdTime = try container.decode(String.self, forKey: .createdTime)
        let fields = try container.nestedContainer(keyedBy: FieldsKeys.self, forKey: .fields)
        name = try fields.decode(String.self, forKey: .name)
        number = try fields.decode(Int.self, forKey: .number)
        completeName = try fields.decode(String.self, forKey: .completeName)
    }
    
    enum CodingKeys: String, CodingKey {
        case id
        case createdTime
        case fields
    }
    
    enum FieldsKeys: String, CodingKey {
        case number         = "Numero"
        case name           = "Nome"
        case completeName   = "Key"
    }
}

extension Month: Equatable {
    
    static func == (lhs: Month, rhs: Month) -> Bool {
        return lhs.id == rhs.id
    }
}

extension Month: Hashable {
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
}

extension Month: CustomStringConvertible {
    var description: String {
        return "\(completeName)"
    }
}

可选类型经常发生这种情况,您只需指定类型

将您的标签更改为类似这样的内容

.tag(month as? Month)

.tag(category as? Category)

类型必须完全匹配。 monthcategory 是非可选的,因此需要将它们转换为可选的,因为您的 @State 是可选的