从选择器选择值时,有没有办法保存另一个字段值(例如_id)?
我有这些类 - 用户和中心,
import Foundation
import RealmSwift
class User: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var _id = UUID().uuidString
@Persisted var userName = ""
@Persisted var firstName = ""
@Persisted var lastName = ""
@Persisted var userMobile = ""
@Persisted var userCentre = ""
@Persisted var userCentreId: ObjectId?
@Persisted var userPreferences: UserPreferences?
@Persisted var lastSeenAt: Date?
@Persisted var conversations = List<Conversation>()
@Persisted var presence = "On-Line"
var isProfileSet: Bool { !(userPreferences?.isEmpty ?? true) }
var presenceState: Presence {
get { return Presence(rawValue: presence) ?? .hidden }
set { presence = newValue.asString }
}
convenience init(userName: String, id: String) {
self.init()
self.userName = userName
_id = id
userPreferences = UserPreferences()
userPreferences?.displayName = userName
presence = "On-Line"
}
}
enum Presence: String {
case onLine = "On-Line"
case offLine = "Off-Line"
case hidden = "Hidden"
var asString: String {
self.rawValue
}
}
import Foundation
import RealmSwift
import MapKit
class Centre: Object, ObjectKeyIdentifiable {
@Persisted var _id: ObjectId = ObjectId.generate()
@Persisted var centreName = ""
@Persisted var centreDesc = ""
@Persisted var centreLocation: Coordinates?
override static func primaryKey() -> String? {
return "_id"
}
convenience init(centreName: String, centreDesc: String, x: Double, y: Double) {
self.init()
self.centreName = centreName
self.centreDesc = centreDesc
self.centreLocation?.x = x
self.centreLocation?.y = y
}
var coordinate: CLLocationCoordinate2D {
CLLocationCoordinate2D(latitude: (centreLocation?.y)!, longitude: (centreLocation?.x)!)
}
}
我可以查看设置用户配置文件和用户相关的中心,并带有一个显示可用中心的选择器。选择中心名时,我也想保存中心的_id。我该怎么做?是可以在选择器中传递一个隐藏的值,还是我应该使用两个选择器 - 会占用屏幕空间。
struct SetUserProfileView: View {
@AppStorage("shouldShareLocation") var shouldShareLocation = false
@Environment(\.realm) var realm
@ObservedRealmObject var user: User
@ObservedResults(Centre.self) var centres
@Binding var isPresented: Bool
@Binding var userID: String?
@State private var displayName = ""
@State private var photo: Photo?
@State private var photoAdded = false
@State private var firstName = ""
@State private var lastName = ""
@State private var userMobile = ""
@State private var selectedCentre = ""
@State public var selectedCentreId: ObjectId
var body: some View {
Form {
Section {
if let photo = photo {
AvatarButton(photo: photo) {
self.showPhotoTaker()
}
}
if photo == nil {
Button(action: { self.showPhotoTaker() }) {
Text("Add Photo")
}
}
TextField("Display Name", text: $displayName)
TextField("First Name", text: $firstName)
TextField("Last Name", text: $lastName)
TextField( "Mobile Number", text: $userMobile)
Text("Select Centre")
Picker(selection: $selectedCentre, label: Text("Select Centre")) {
Text("Nothing Selected").tag("")
ForEach(centres, id: \.self) { centre in
Text(centre.centreName).tag(centre.centreName)
}
}
.onAppear(perform: initData)
.pickerStyle(.menu)
.accentColor(.white)
I have these classes - User and Centre
import Foundation
import RealmSwift
class User: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var _id = UUID().uuidString
@Persisted var userName = ""
@Persisted var firstName = ""
@Persisted var lastName = ""
@Persisted var userMobile = ""
@Persisted var userCentre = ""
@Persisted var userCentreId: ObjectId?
@Persisted var userPreferences: UserPreferences?
@Persisted var lastSeenAt: Date?
@Persisted var conversations = List<Conversation>()
@Persisted var presence = "On-Line"
var isProfileSet: Bool { !(userPreferences?.isEmpty ?? true) }
var presenceState: Presence {
get { return Presence(rawValue: presence) ?? .hidden }
set { presence = newValue.asString }
}
convenience init(userName: String, id: String) {
self.init()
self.userName = userName
_id = id
userPreferences = UserPreferences()
userPreferences?.displayName = userName
presence = "On-Line"
}
}
enum Presence: String {
case onLine = "On-Line"
case offLine = "Off-Line"
case hidden = "Hidden"
var asString: String {
self.rawValue
}
}
import Foundation
import RealmSwift
import MapKit
class Centre: Object, ObjectKeyIdentifiable {
@Persisted var _id: ObjectId = ObjectId.generate()
@Persisted var centreName = ""
@Persisted var centreDesc = ""
@Persisted var centreLocation: Coordinates?
override static func primaryKey() -> String? {
return "_id"
}
convenience init(centreName: String, centreDesc: String, x: Double, y: Double) {
self.init()
self.centreName = centreName
self.centreDesc = centreDesc
self.centreLocation?.x = x
self.centreLocation?.y = y
}
var coordinate: CLLocationCoordinate2D {
CLLocationCoordinate2D(latitude: (centreLocation?.y)!, longitude: (centreLocation?.x)!)
}
}
I have a view to set up user profile and the user's associated centre with a picker showing the available centres. I would like to also save the _id of the centre when the centre name is selected. How do I do that? Is it possible to pass a hidden value in Picker or should I use two Pickers - will take up screen space.
struct SetUserProfileView: View {
@AppStorage("shouldShareLocation") var shouldShareLocation = false
@Environment(\.realm) var realm
@ObservedRealmObject var user: User
@ObservedResults(Centre.self) var centres
@Binding var isPresented: Bool
@Binding var userID: String?
@State private var displayName = ""
@State private var photo: Photo?
@State private var photoAdded = false
@State private var firstName = ""
@State private var lastName = ""
@State private var userMobile = ""
@State private var selectedCentre = ""
@State public var selectedCentreId: ObjectId
var body: some View {
Form {
Section {
if let photo = photo {
AvatarButton(photo: photo) {
self.showPhotoTaker()
}
}
if photo == nil {
Button(action: { self.showPhotoTaker() }) {
Text("Add Photo")
}
}
TextField("Display Name", text: $displayName)
TextField("First Name", text: $firstName)
TextField("Last Name", text: $lastName)
TextField( "Mobile Number", text: $userMobile)
Text("Select Centre")
Picker(selection: $selectedCentre, label: Text("Select Centre")) {
Text("Nothing Selected").tag("")
ForEach(centres, id: \.self) { centre in
Text(centre.centreName).tag(centre.centreName)
}
}
.onAppear(perform: initData)
.pickerStyle(.menu)
.accentColor(.white)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我想你想要这个
I assume you want this