繁体   English   中英

使用 SwiftUI 显示多个叠加层

[英]Displaying multiple overlays with SwiftUI

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

覆盖.swift

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

内容视图.swift

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

为 iOS 13 编译此代码按预期工作。 另一方面,对于 iOS 14 showSheetX() 打开一个带有空视图的工作表。 关闭工作表并再次打开它会显示 OverlayView_ButtonX。 调试显示第一次调用 showSheetX() 时 viewX_visible 为 false。 这是 iOS 本身的错误还是我在这里遗漏了什么?

先感谢您!

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

内容视图.swift

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

请随时向我解释为什么此代码有效。 我真的很困惑:S

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM