Formation PUB900 : Développer une application pour iPhone avec SwiftUI, H-2024 Réagir à un changement

53.1 .onChange()


Dans cette fiche :

onChange()

On sait que les vues peuvent être mises à jour automatiquement lors du changement de valeur pour une variable déclarée par exemple à l'aide de @State ou @AppStorage.

Mais s'il fallait, lorsqu'une variable change, effectuer une autre tâche qu'un rechargement de la vue, par exemple faire jouer un son ou une vibration ou encore laisser une trace dans la sortie standard?

C’est à l’aide du modificateur onChange() que l’on peut exécuter ce traitement.

SwiftUI

struct ContentView: View {
  @State private var uneVariable: String = ""

  var body: some View {
    VStack {
      ...
    }
    .onChange(of: uneVariable) { ancienneValeur, nouvelleValeur in
      print(ancienneValeur)   // affiche l'ancienne valeur
      print(nouvelleValeur)   // affiche la nouvelle valeur
      ...
    }

  }
}

Dans le cas où le code n'a pas besoin de travailler avec l'ancienne valeur, il est possible d'utiliser cette syntaxe simplifiée :

SwiftUI

struct ContentView: View {
  @State private var uneVariable: String = ""

  var body: some View {
    VStack {
      ...
    }
    .onChange(of: uneVariable) {
      print(uneVariable)   // affiche la nouvelle valeur
      ...
    }

  }
}

Réagir au changement d'une variable optionnelle

Dans le cas où la variable est optionnelle, il faut comprendre que les variables qui contiennent l'ancienne valeur et la nouvelle valeur sont également optionnelles.

Il faudra alors prendre soin de les déballer correctement.

SwiftUI

struct ContentView: View {
  @State private var uneVariable: String? = ""

  var body: some View {
    VStack {
      ...
    }
    .onChange(of: uneVariable) { ancienneValeur, nouvelleValeur in
      if nouvelleValeur != nil {
         print(nouvelleValeur!
      }
      else {
        print("La nouvelle valeur est nulle.")
      }
      ...
    }

  }
}

ou encore :

SwiftUI

struct ContentView: View {
  @State private var uneVariable: String? = ""

  var body: some View {
    VStack {
      ...
    }
    .onChange(of: uneVariable) { ancienneValeur, nouvelleValeur in
      if let nouvelleValeur = nouvelleValeur {
         print(nouvelleValeur) 
      }
      else {
        print("La nouvelle valeur est nulle.")
      }
      ...
    }

  }
}

ou, de façon plus concise :

SwiftUI

struct ContentView: View {
  @State private var uneVariable: String? = ""

  var body: some View {
    VStack {
      ...
    }
    .onChange(of: uneVariable) { ancienneValeur, nouvelleValeur in
       print(nouvelleValeur ?? "La nouvelle valeur est nulle."
      ...
    }

  }
}

Syntaxes obsolètes

Avant iOS 17, la syntaxe de onChange() pouvait prendre différentes formes.

Ces syntaxes sont obsolètes et ne doivent plus être utilisées si on cible iOS 17 ou plus.

SwiftUI

.onChange(of: uneVariable, perform: { nouvelleValeur in
  ...
})

SwiftUI

.onChange(of: uneVariable, perform: { _ in
...
})

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre