swiftUI中视图之间的转换时发生内存泄漏

问题描述

我有问题。我有4个视图,通过.fullScreenCover()进行向前过渡,在2,3和4个视图上,我应该有一个向后按钮,按过渡到1个视图应该会发生,问题是当我开始在视图,它开始增加内存,并在调试器中显示很多视图,如何解决此问题?还是有其他方法可以实现这一目标? P.s视图应全屏显示

FirstView

  import SwiftUI
   
  class SanityCheck0 {
     deinit {
       print("\(#file):\(#line) \(#function) Called.")
   } 
}
   
   struct FirstView: View {
     @State var isPresentable = false
     private let sany = SanityCheck0()
   
   var body: some View {
      // Text("Hello,world!").padding()
           Button("Next",action: {
               self.isPresentable.toggle()
   
           })
           .fullScreenCover(isPresented: $isPresentable) {
               SecondView()
   
           }
   }
       
   }

SecondView

import SwiftUI

class SanityCheck1 {
    deinit {
        print("\(#file):\(#line) \(#function) Called.")
    }
}

struct SecondView: View {
    @State var isPresentable = false
    @State var isPresentable1 = false
    
    private let senity = SanityCheck1()
    
    var body: some View {
        HStack(spacing: 50) {
            Button("Next",action: {
                self.isPresentable.toggle()

            })
            .fullScreenCover(isPresented: $isPresentable) {
                ThirdView()

            }
            
            Button("Back",action: {
                self.isPresentable1.toggle()

            })
            .fullScreenCover(isPresented: $isPresentable1) {
                FirstView()

            }
        }
        .frame(maxWidth: .infinity,maxHeight: .infinity)
        .background(Color.yellow)
        .edgesIgnoringSafeArea(.all)
        
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        SecondView()
    }
}

ThirdView

import SwiftUI

class SanityCheckk {
    deinit {
        print("\(#file):\(#line) \(#function) Called.")
    }
}

struct ThirdView: View {
    @State var isPresentable = false
    @State var isPresentable1 = false 
    
    private let sanituCheck = SanityCheckk()
    
    var body: some View {
        HStack(spacing: 50) {
            Button("Next",action: {
                self.isPresentable.toggle()

            })
            .fullScreenCover(isPresented: $isPresentable) {
                FourthView()

            }
            
            Button("Back",maxHeight: .infinity)
        .background(Color.green)
        .edgesIgnoringSafeArea(.all)
    }
}


struct TwoScen_Previews: PreviewProvider {
    static var previews: some View {
        ThirdView()
    }
}

FourthView

import SwiftUI

struct FourthView: View {
    @State var isPresentable = false
    @State var isPresentable1 = false
    
    var body: some View {
        HStack(spacing: 50) {
            Button("Next",action: {
                self.isPresentable.toggle()

            })
            .fullScreenCover(isPresented: $isPresentable) {
                SecondView()

            }
            
            Button("Back",maxHeight: .infinity)
        .background(Color.red)
        .edgesIgnoringSafeArea(.all)
    }
}

struct FourthView_Previews: PreviewProvider {
    static var previews: some View {
        FourthView()
    }
}

enter image description here

解决方法

问题在于,尽管有标题,您的“后退”按钮也不会返回。例如,当您在SecondView中说时,

        .fullScreenCover(isPresented: $isPresentable1) {
            FirstView()
        }

...您不会回到旧版的FirstView;您正在制作另一个 FirstView,它是一个全新的和不同的FirstView,因此,除了SecondView之外,现在还有两个 FirstViews。您一直在这样做,只是制作越来越多的新视图而永不退缩。

从SecondView返回到FirstView的方法是将isPresentable回到FirstView上回到false

 struct FirstView: View {
     @State var isPresentable = false // <-- this

您可以通过将其绑定交给SecondView来实现。示例:

struct FirstView: View {
    @State var isPresentable = false
    var body: some View {
        Button("Next",action: {
            self.isPresentable.toggle()
        })
        .fullScreenCover(isPresented: $isPresentable) {
            SecondView(firstIsPresentable: $isPresentable)
        }
    }
}

struct SecondView: View {
    @Binding var firstIsPresentable : Bool
    var body: some View {
        Button("Back",action: {
            self.firstIsPresentable.toggle()
        })
    }
}

以此类推。