7 votes

Comment rafraîchir une vue lors du rejet d'une feuille dans SwiftUI ?

Je veux obtenir l'entrée de l'utilisateur (en utilisant TextField ) d'une vue et l'afficher (le texte que l'utilisateur a saisi) dans une autre vue.

Voici un exemple minimal et reproductible

J'ai créé un ObservableObject nommé UserData

import Foundation
import  SwiftUI
import Combine

class UserData: ObservableObject {
    @Published var name: String = ""
}

Puis j'ai créé une vue nommée Edit avec un TextField où l'utilisateur peut saisir un texte

import SwiftUI

struct Edit: View {

    @ObservedObject var userData = UserData()

    var body: some View {
        VStack {
            TextField("Enter Name", text: $userData.name)
        }
    }
}

Et voici le ContentView Dans la vue Root, je veux afficher le texte que l'utilisateur a saisi (initialement, le texte est vide).

import SwiftUI

struct ContentView: View {

    @State var isPresented = false
    @ObservedObject var userData = UserData()

    var body: some View {
        VStack {
            Text(self.userData.name)
                .font(.largeTitle)

            Button(action: { self.isPresented.toggle() }) {
                    Text("Click me to Edit")
            }
            .sheet(isPresented: $isPresented) {
                Edit()
            }
        }
    }
}

Lorsque nous cliquons sur le bouton dans le ContentView une feuille est présentée avec Edit voir

Lorsque je clique sur ce bouton, une feuille avec Edit La vue apparaît.
Ensuite, je peux entrer un texte en utilisant la fonction TextField .
Mais lorsque j'écarte la feuille en la faisant glisser vers le bas, la Text dans le ContentView est toujours vide .

Comme je le sais, $userData.name mises à jour lorsque je saisis quelque chose dans le TextField .

Mais un Text dans une autre vue avec une liaison self.userData.name ne va pas refléter la valeur mise à jour .

Existe-t-il un moyen de mettre à jour le Text lorsque nous rejetons la feuille ou y a-t-il un autre moyen de le faire ?

Aidez-moi, s'il vous plaît.

Merci de lire ma question

7voto

Clarko Points 129

Votre Edit vue et ContentView détiennent chacun un UserData objets. Ils ne partagent pas de références à un même objet, de sorte que la modification de l'un d'entre eux ne met pas à jour l'autre.

Mettez d'abord à jour votre Edit pour qu'il n'a pas initialiser sa propre UserData objet :

@ObservedObject var userData: UserData

Ensuite, dans votre ContentView , passer un référence à votre seul canonical UserData dans le Edit vue :

.sheet(isPresented: $isPresented) {
    Edit(userData: self.userData)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X