Meilleures pratiques d'utilisation d'un FetchedResults pour remplir un sélecteur SwiftUI
Je travaille actuellement avec CoreData FetchedResults
et SwiftUIs PickerView
. Ce faisant, j'ai rencontré un problème lors de l'utilisation de FetchedResults pour remplir un PickerView:
Je peux évidemment utiliser FetchedResults pour remplir le PickerView, mais quelle est la meilleure solution (également du point de vue UI / UX) pour définir @State pour le résultat sélectionné?
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User.lastName, ascending: true)], animation: .default) private var users: FetchedResults<User>
@State var user: User = User()
// ...
Picker(selection: $user, label: Text("User")) {
ForEach(users) { user in
Text(lastName).tag(user)
}
}
Cela fonctionne, mais ce n'est probablement pas la manière la plus élégante de créer un nouvel objet utilisateur vide pour le définir par défaut.
Quelqu'un d'entre vous a-t-il une meilleure idée / meilleure pratique pour résoudre ce problème probablement souvent?
Réponses
Si vous ne voulez pas créer un utilisateur factice () tout le temps, ce qui n'est pas une bonne pratique comme vous l'avez mentionné, vous devez faire votre FetchRequest dans votre init()
ou transmettre votre FetchedResult à une autre vue.
Voici une solution avec un autre point de vue
struct ContentView : View {
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User.lastName, ascending: true)], animation: .default) private var users: FetchedResults<User>
var body : some View {
PickerView(users: Array(users))
}
}
struct PickerView : View {
var users : [User]
@State var selectedUser : User?
init(users: [User]) {
self.users = users
self._selectedUser = State(initialValue: users.first)
}
var body : some View {
Picker(selection: $selectedUser, label: Text("Users")) {
ForEach(users) { user in
Text(user.lastName ?? "").tag(user as User?)
}
}
}
}
Éditer:
En fait, vous pouvez simplement déclarer votre personne comme facultative. Vous n'avez donc pas à fournir de valeur par défaut. Lors de la récupération, il se déplacera automatiquement vers le premier élément du sélecteur. Si vous souhaitez sélectionner un autre, vous pouvez utiliser cette méthode ci-dessus. En ce qui concerne le FetchRequest dans init (), il a publié une réponse il y a quelques mois ici