Lorsque vous allez dans une vue, revenez en arrière, puis revenez à cette vue, les variables ont des données, donc ma vue n'est pas complètement détruite. Comment puis-je détruire complètement ma vue?
Par exemple:
struct Home: View { var body : some View { VStack { NavigationLink(destination : SliderView()){ Text("\(self.myData.lastText)").bold() } } } } struct SliderView: View { @ObservedObject myData : MyData = MyData() @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> var body : some View { VStack { Button(action : { self.presentationMode.wrappedValue.dismiss() }) { Text("Dismiss").bold() } Text("\(self.myData.lastText)").bold() } } }
Quand je vais à SliderView
puis reviens en arrière et va à SliderView
encore une fois, self.myData.lastText
n'est pas vide, et il a la valeur précédente.
3 Réponses :
La vue
est en cours de destruction, mais la nouvelle vue
utilise l'ancien viewModel
.
Vous faites référence au même objet MyData ()
tout le temps. Donc, si vous le changez n'importe où, toutes les références seront mises à jour. Et comme vous semblez observer les changements ( @ObservedObject
) en temps réel, il se mettra à jour dès qu'il changera n'importe où.
Vous devriez fournir plus de détails pour des informations plus précises.
Merci pour votre réponse. Je veux aussi détruire mon viewModel. Comment puis je faire ça?
Vous ne devez rien détruire vous-même. Vous ne gardez simplement pas une référence à celui-ci et ARC se chargera de le détruire si nécessaire.
Il semble que vous ayez besoin d'un @State
à la place
Je n'ai aucune référence à ce sujet. Je crée myData
dans SliderView
et je l'utilise également là-bas
Vous avez modifié la question d'origine. Hmm. Comme je l'ai mentionné précédemment, il y a un manque d'informations sur votre code. si vous avez juste besoin de myModel
dans le SlideView
, alors pourquoi avez-vous besoin d'un @ObservedObject
en premier lieu? vous devriez envisager d'utiliser un @State
à la place.
Je @ObservedObject
car MyData est une classe et non une structure, donc ses modifications n'affectent pas l'affichage
Vous ne faites rien avec cela dans l'exemple que vous avez fourni. Vous n'en avez donc pas besoin. Passez simplement la valeur ici, PAS le modèle de données entier!
Depuis Xcode 12 et iOS 14, vous pouvez désormais utiliser @StateObject
. Consultez la documentation officielle pour plus d'informations.
J'ai ressenti les mêmes symptômes.
la raison en est que
Accueil
n'est pas recréé lorsque vous revenez à Accueil car Accueil est la vue racine
et le NavigationLink
de Home
contient SliderView ()
et utilise le SliderView
existant
Je pense que vous pouvez tester le ci-dessous et trouvez que SliderView
est recréé et chargez à nouveau les données.
Cela montre simplement ce qui fait le problème. Je ne pense pas que le code ci-dessous soit bon.
car j'ai une courte expérience sur SwiftUI. veuillez me faire savoir si quelque chose ne va pas. et je ne sais pas quelle est la meilleure approche pour résoudre ce problème. bien que le code ci-dessous puisse résoudre le problème.
struct Home: View { @State var appearCount = 0 var body : some View { VStack { if (appearCount > 0) { //this code is added just for re draw view. when appearCount is changed } NavigationLink(destination : SliderView()){ Text("\(self.myData.lastText)").bold() } }.onAppear { appearCount += 1 } } }
Vous en avez probablement une référence. Veuillez publier le code minimal pour reproduire le problème
@MojtabaHosseini a mis à jour la question, veuillez la relire