Impossible de convertir la valeur de type 'String' en type d'argument attendu 'Binding <String>'
Sep 13 2020
Je suis nouveau sur SwiftUi et j'ai une erreur que je ne peux pas corriger. Fondamentalement, je souhaite modifier l'attribut de nom de la classe AB dans le SettingsView.
De plus, j'ai des questions auxquelles j'espère que tout le monde pourra répondre.
- Dois-je faire de la classe AB un ObservableObject avec des attributs @Published, alors qu'elle est déjà dans ma classe User en tant qu'attribut @Published?
- La classe AB doit-elle être une structure? J'utilise la classe User comme EnvironmentObject
class User: ObservableObject {
@Published var name: String
...
@Publsihed var ab: [AB]
@Published var currentAb: AB?
internal init(name: String, ab: [AB]) {
self.name = name
self.ab = ab
self.currentAb = ab.first
}
}
class AB: ObervableObject {
@Published var name: String
...
}
J'obtiens l'erreur ici à cause de TextField ("nouveau nom", texte: $ user.currentAb.wrappedValue.name).
struct SettingsView: View {
@EnvironmentObject var user: User
var body: some View {
Form { //Error: Unable to infer complex closure return type; add explicit type to disambiguate
Section(header: Text("")) {
TextField("new name", text: $user.currentAb.wrappedValue.name) // <- Error is shown here
.textFieldStyle(RoundedBorderTextFieldStyle())
}
}
}
Merci.
Réponses
2 Asperi Sep 13 2020 at 01:33
Il est préférable de le faire en se séparant en une vue différente, comme
var body: some View {
Form {
Section(header: Text("")) {
if user.currentAb != nil {
SomeNameView(vm: user.currentAb!)
} else {
Text("any holder view here")
}
}
}
}
et vue séparée
struct SomeNameView: View {
@ObservedObject var vm: AB
var body: some View {
TextField("new name", text: $vm.name)
.textFieldStyle(RoundedBorderTextFieldStyle())
}
}