SwiftModalPresentation

一个简单的库,用于安全地在 SwiftUI 中呈现 sheet 和其他模态视图。
它旨在解决这类问题

Currently, only presenting a single sheet is supported.
The next sheet will be presented when the currently presented sheet gets dismissed.

用法

该库旨在成为一个即插即用的替代方案,用于在使用 @State@Published 时呈现 sheet。
如果您尝试在已呈现一个 sheet 的同时呈现一个新的 sheet,它将自动关闭之前的 sheet,然后再显示新的 sheet。

对于使用 @ModalState@State

struct ContentView: View {
    @ModalState private var isShowingSheet1 = false
    @ModalState private var isShowingSheet2 = false
    
    var body: some View {
        VStack {
            Button("Show sheet 1") {
                isShowingSheet1 = true
            }
        }
        .sheet(isPresented: $isShowingSheet1) {
            VStack {
                Text("Sheet 1")
                Button("Show sheet 2") {
                    isShowingSheet2 = true
                }
            }
        }
        .sheet(isPresented: $isShowingSheet2) {
            Text("Sheet 2")
        }
    }
}

对于在 ObservableObject 中使用 @ModalPublished@Published

class SomeObject: ObservableObject {
    @ModalPublished var isShowingSheet1 = false
    @ModalPublished var isShowingSheet2 = false
}

struct ContentView: View {
    @StateObject private var someObject = SomeObject()

    var body: some View {
        VStack {
            Button("Show sheet 1") {
                someObject.isShowingSheet1 = true
            }
        }
        .sheet(isPresented: $someObject.isShowingSheet1) {
            VStack {
                Text("Sheet 1")
                Button("Show sheet 2") {
                    someObject.isShowingSheet2 = true
                }
            }
        }
        .sheet(isPresented: $someObject.isShowingSheet2) {
            Text("Sheet 2")
        }
    }
}

可选地,您可以为 ModalState/Published(context: "SomeContextKey") 提供一个上下文,以便在同一视图中打开嵌套的 sheet。

许可

此软件包根据宽松的 ApacheV2 许可证提供,供您享用。