从选择器选择值时,有没有办法保存另一个字段值(例如_id)?

发布于 2025-02-07 19:25:02 字数 3907 浏览 1 评论 0原文

我有这些类 - 用户和中心,

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不必你懂 2025-02-14 19:25:02

我想你想要这个

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)
    }
}
.onChange(of: selectedCentre) { value in
    // do whatever needed here             // << here !!
}

I assume you want this

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)
    }
}
.onChange(of: selectedCentre) { value in
    // do whatever needed here             // << here !!
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文