0
votes

Pourquoi les vues ne se détruisent pas complètement dans SwiftUI

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.


2 commentaires

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


3 Réponses :


0
votes

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.


7 commentaires

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!



1
votes

Depuis Xcode 12 et iOS 14, vous pouvez désormais utiliser @StateObject . Consultez la documentation officielle pour plus d'informations.


0 commentaires

1
votes

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 }
    }

}


0 commentaires