【问题标题】:SwiftUI picker in Form not working properly表单中的 SwiftUI 选择器无法正常工作
【发布时间】:2021-11-17 17:53:42
【问题描述】:

我正在为这种奇怪的 Picker 行为而苦苦挣扎。基本上,当我点击选择器行时,我可以看到选项,但每次点击一行时,什么都没有发生。没有复选标记,没有回到上一个视图,也没有选择。我还尝试在ForEach 中添加id: \.self,但没有任何变化。我正在使用带有 Xcode 13 的 iOS 15,但问题也存在于 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)"
    }
}

【问题讨论】:

  • 我们无法用所提供的信息真正回答您的问题。您没有说明您认为是不正确的行为,也没有提供有人可以构建以查看您所看到的代码。请参阅:How do I ask a good question?How to create a Minimal, Reproducible Example
  • @Yrb 对不起,我忘了添加为什么行为奇怪的细节。我刚刚编辑了问题。
  • 你仍然没有一个最小的、可重现的例子。没有人可以运行您的代码来尝试修复它。

标签: swift swiftui picker


【解决方案1】:

这发生在可选项上,你只需要指定类型

把你的标签改成这样的

.tag(month as? Month)

.tag(category as? Category)

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

【讨论】:

  • 这成功了,非常感谢。我对这个“小”的事情没有给予足够的重视。
猜你喜欢
  • 2017-04-07
  • 2015-01-17
  • 1970-01-01
  • 2023-03-13
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多