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.

  1. 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?
  2. 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())
    }
}