表单中的 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)
类型必须完全匹配。 month
和 category
是非可选的,因此需要将它们转换为可选的,因为您的 @State
是可选的
我正在为这种奇怪的选择器行为而苦恼。基本上,当我点击选择器行时,我可以看到选项,但每次我点击一行时,什么也没有发生。没有复选标记,没有返回到上一个视图,也没有选择。我也尝试在 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)
类型必须完全匹配。 month
和 category
是非可选的,因此需要将它们转换为可选的,因为您的 @State
是可选的