问题描述
我有问题。我有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()
}
}
解决方法
问题在于,尽管有标题,您的“后退”按钮也不会返回。例如,当您在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()
})
}
}
以此类推。