为什么在SwiftUI中视图没有完全销毁

3

当进入某个视图、返回,然后再次进入此视图时,变量仍然保留数据,因此我的视图并没有完全销毁。我该怎么完全销毁我的视图?

例如:

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

}

当我进入SliderView然后返回并再次进入SliderView时,self.myData.lastText不为空,它具有先前的值。

3
您可能已经与此相关。请发布最小化代码以重现问题。 - Mojtaba Hosseini
@MojtabaHosseini 更新了问题,请再次阅读。 - Rasul
3个回答

2

从Xcode 12和iOS 14开始,您现在可以使用@StateObject。有关更多信息,请参见官方文档


2
我遇到了同样的症状。 原因是当返回到主页时,由于主页是根视图,所以不会重新创建Home。 而HomeNavigationLink包含SliderView()并使用现有的SliderView
我认为您可以测试下面的代码,并发现SliderView被重新创建并再次加载数据。 这只是展示了问题的原因。我认为下面的代码并不好。 因为我在SwiftUI方面经验较少,如果有什么问题请告诉我。我不知道解决这个问题的最佳方法,尽管下面的代码可以解决问题。
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 }
    }

}

1
视图正在销毁,但新视图使用先前的viewModel。您一直在引用相同的MyData()对象。因此,如果您在任何地方进行更改,所有引用都将更新。并且由于似乎您正在实时观察更改(@ObservedObject),因此它会在任何地方更改时立即更新。您应该提供更多详细信息以获得更准确的信息。

谢谢您的回答。我也想销毁我的viewModel。我该怎么做? - Rasul
你不应该自己销毁任何东西。只需不保留对它的引用,ARC 将在需要时处理其销毁。 - Mojtaba Hosseini
似乎你需要一个 @State - Mojtaba Hosseini
我没有任何对它的引用。我在SliderView内部创建了myData并在那里使用它。 - Rasul
你改变了原问题。嗯,正如我之前提到的,关于你的代码缺乏信息。如果你只需要在 SlideView 中使用 myModel,那么为什么一开始要使用 @ObservedObject?你应该考虑使用 @State - Mojtaba Hosseini
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接