Dans cette fiche :
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.
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 :
struct ContentView: View {
@State private var uneVariable: String = ""
var body: some View {
VStack {
...
}
.onChange(of: uneVariable) {
print(uneVariable) // affiche la nouvelle valeur
...
}
}
}
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.
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 :
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 :
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.")
...
}
}
}
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.
...
})
...
})
▼Publicité