Ios 使用SwiftUI显示多个覆盖图

Ios 使用SwiftUI显示多个覆盖图,ios,swift,Ios,Swift,我正在尝试使用SwiftUI显示多张工作表 Overlay.swift 为iOS 13编译此代码的效果与预期一样。另一方面,对于iOS 14,showSheetX()会打开一个视图为空的工作表。卸下工作表并再次打开它将显示OverlayView_ButtonX。调试表明,当首次调用showSheetX()时,viewX_visible为false。 这是iOS本身的错误还是我遗漏了什么 提前谢谢你 我想我找到了解决这个问题的方法: ContentView.swift 导入快捷界面 var vie

我正在尝试使用SwiftUI显示多张工作表

Overlay.swift

为iOS 13编译此代码的效果与预期一样。另一方面,对于iOS 14,showSheetX()会打开一个视图为空的工作表。卸下工作表并再次打开它将显示OverlayView_ButtonX。调试表明,当首次调用showSheetX()时,viewX_visible为false。 这是iOS本身的错误还是我遗漏了什么


提前谢谢你

我想我找到了解决这个问题的方法:

ContentView.swift

导入快捷界面

var view1_visible:Bool=false/我想我找到了这个问题的解决方案:

ContentView.swift

导入快捷界面

var view1_visible:Bool=false//这是否回答了您的问题?这回答了你的问题吗?
import SwiftUI

struct OverlayWith<Content: View>: View {
    let content: () -> Content
    @Environment(\.presentationMode) private var presentationMode
    
    var body: some View {
        VStack{
            Button(action: {
               self.presentationMode.wrappedValue.dismiss()
            }) {
                Image(systemName: "chevron.compact.down")
                    .resizable()
                    .frame(width: 40, height: 15)
                    .accentColor(Color.gray)
                    .padding()
            }
            
            content()
            Spacer()
        }
    }
}

struct OverlayView_Button1: View {
    var body: some View{
        Text("Button 1 triggered this overlay")
    }
}

struct OverlayView_Button2: View {
    var body: some View{
        Text("Button 2 triggered this overlay")
    }
}
import SwiftUI

struct ContentView: View {
    @State var overlayVisible: Bool = false
    // Button States
    @State var view1_visible: Bool = false
    @State var view2_visible: Bool = false
    
    var body: some View {
        VStack() {
            Button(action: {
                self.showSheet1()
            }, label: {
                Text("Button 1")
            })
            Button(action: {
                self.showSheet2()
            }, label: {
                Text("Button 2")
            })
        }
        .sheet(isPresented: $overlayVisible, content:{
            if self.view1_visible {
                OverlayWith(content: {
                    OverlayView_Button1()
                })
            } else if self.view2_visible {
                OverlayWith(content: {
                    OverlayView_Button2()
                })
            }
        })
    }
    
    func showSheet1(){
        self.resetButtonStates()
        self.view1_visible = true
        self.overlayVisible = true
    }
    
    func showSheet2(){
        self.resetButtonStates()
        self.view2_visible = true
        self.overlayVisible = true
    }
    
    func resetButtonStates(){
        self.view1_visible = false
        self.view2_visible = false
    }
    
}
import SwiftUI


var view1_visible: Bool = false // <- view1_visible is not a state anymore
var view2_visible: Bool = false // <- view2_visible is not a state anymore

struct ContentView: View {
    @State var overlayVisible: Bool = false
    
    var body: some View {
        VStack() {
            Button(action: {
                self.showSheet1()
            }, label: {
                Text("Button 1")
            })
            Button(action: {
                self.showSheet2()
            }, label: {
                Text("Button 2")
            })
        }
        .sheet(isPresented: $overlayVisible, content:{
            if view1_visible {
                OverlayWith(content: {
                    OverlayView_Button1()
                })
            } else if view2_visible {
                OverlayWith(content: {
                    OverlayView_Button2()
                })
            }
        })
    }
    
    func showSheet1(){
        self.resetButtonStates()
        view1_visible = true
        self.overlayVisible = true
    }
    
    func showSheet2(){
        self.resetButtonStates()
        view2_visible = true
        self.overlayVisible = true
    }
    
    func resetButtonStates(){
        view1_visible = false
        view2_visible = false
    }
    
}