RealmSwift中Picker无法选择已有EventType值的问题求助
解决RealmSwift中Picker无法选中选项的问题
问题原因
你的Picker无法保持选中状态,核心问题在于:
@ObservedResults(EventType.self)返回的RealmResults是动态实时更新集合,每次Realm数据变动时,集合内元素会被重新实例化,导致Picker选项频繁重建,选中状态被重置。- 通过
ObjectId作为选中标识时,虽值相等,但动态集合的频繁刷新可能引发隐性匹配逻辑问题。
解决方案1:直接绑定EventType对象(推荐)
将选中状态直接绑定到EventType对象,跳过ObjectId间接匹配,同时简化后续赋值逻辑:
修改步骤:
- 替换选中状态变量类型:
// 原代码 @State var selected_event_type: ObjectId? // 修改为 @State var selected_event_type: EventType?
- 更新Picker的tag与绑定逻辑:
Picker("Event Type", selection: $selected_event_type) { Text("Select Event Type").tag(nil as EventType?) ForEach(eventTypes) { eventType in Text(eventType.name).tag(eventType as EventType?) } }
- 简化保存按钮中的赋值代码:
// 原代码 newEvent.event_type = eventTypes.first(where: { $0._id == selected_event_type }) // 修改为 newEvent.event_type = selected_event_type
解决方案2:将动态集合转为静态数组
若需保留ObjectId作为选中标识,可将Realm动态集合转为普通数组,避免频繁刷新导致Picker状态丢失:
修改步骤:
- 添加静态数组存储EventType列表:
@State private var eventTypeList: [EventType] = []
- 在View出现或集合变化时更新静态数组:
Form { // 原有代码 } .navigationBarTitle("Add Event") .onAppear { eventTypeList = Array(eventTypes) } .onChange(of: eventTypes) { newValue in eventTypeList = Array(newValue) }
- 修改Picker遍历静态数组:
Picker("Event Type", selection: $selected_event_type) { Text("Select Event Type").tag(ObjectId?.none) ForEach(eventTypeList) { eventType in Text(eventType.name).tag(eventType._id) } }
修改后的完整视图代码(方案1版本)
struct CreateEventView: View { @ObservedResults(Event.self) var events @ObservedResults(EventType.self) var eventTypes @State private var newEvent = Event() @Binding var isInCreateEventView: Bool @State var user: User @State var short_description = "" @State var long_description = "" @State var selected_event_type: EventType? var body: some View { Form { Section(header: Text("New Event Details")) { TextField("Short Description", text: $short_description) Picker("Event Type", selection: $selected_event_type) { Text("Select Event Type").tag(nil as EventType?) ForEach(eventTypes) { eventType in Text(eventType.name).tag(eventType as EventType?) } } Text("Selected Event Type: \(selected_event_type?.name ?? "No Selected Event Type")") TextField("Long Description", text: $long_description) } Section { Button(action: { newEvent.created_by = user.id newEvent.created_by_email = user.profile.email newEvent.short_description = short_description newEvent.event_type = selected_event_type newEvent.long_description = long_description newEvent.created_date = Date() $events.append(newEvent) isInCreateEventView = false }) { HStack { Spacer() Text("Save") Spacer() } } Button(action: { print(eventTypes) isInCreateEventView = false }) { HStack { Spacer() Text("Cancel") Spacer() } } } } .navigationBarTitle("Add Event") } }
内容的提问来源于stack exchange,提问作者Xafloc
相关产品推荐
相关产品推荐

