You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RealmSwift中Picker无法选择已有EventType值的问题求助

解决RealmSwift中Picker无法选中选项的问题

问题原因

你的Picker无法保持选中状态,核心问题在于:

  1. @ObservedResults(EventType.self)返回的RealmResults是动态实时更新集合,每次Realm数据变动时,集合内元素会被重新实例化,导致Picker选项频繁重建,选中状态被重置。
  2. 通过ObjectId作为选中标识时,虽值相等,但动态集合的频繁刷新可能引发隐性匹配逻辑问题。

解决方案1:直接绑定EventType对象(推荐)

将选中状态直接绑定到EventType对象,跳过ObjectId间接匹配,同时简化后续赋值逻辑:

修改步骤:

  1. 替换选中状态变量类型:
// 原代码
@State var selected_event_type: ObjectId?

// 修改为
@State var selected_event_type: EventType?
  1. 更新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?)
    }
}
  1. 简化保存按钮中的赋值代码:
// 原代码
newEvent.event_type = eventTypes.first(where: { $0._id == selected_event_type })

// 修改为
newEvent.event_type = selected_event_type

解决方案2:将动态集合转为静态数组

若需保留ObjectId作为选中标识,可将Realm动态集合转为普通数组,避免频繁刷新导致Picker状态丢失:

修改步骤:

  1. 添加静态数组存储EventType列表:
@State private var eventTypeList: [EventType] = []
  1. 在View出现或集合变化时更新静态数组:
Form {
    // 原有代码
}
.navigationBarTitle("Add Event")
.onAppear {
    eventTypeList = Array(eventTypes)
}
.onChange(of: eventTypes) { newValue in
    eventTypeList = Array(newValue)
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:02:25