一个 Swift 包,用于使用 Property Wrappers 来独家控制状态以供呈现

独占呈现状态

一个 Swift 包,用于使用 Property Wrappers 来独家控制状态以进行展示。

安装

斯威夫特包管理器

要使用 Apple 的 Swift 包管理器进行集成,请将以下内容作为依赖项添加到您的Package.swift.

dependencies: [
    .package(url: "https://github.com/cybozu/ExclusivePresentationState.git", from: "1.0.0")
]

用法

@ExclusivePresentationState

工作表和警报的独家控制

import SwiftUI
import ExclusivePresentationState

struct ContentView: View {
    @ExclusivePresentationState(priority: .low) private var showingSheet = false
    @ExclusivePresentationState(priority: .high) private var showingAlert = false

    var body: some View {
        VStack {
            Button("Show sheet") {
                showingSheet = true
            }

            Button("Show alert with delay") {
                Task {
                    try? await Task.sleep(nanoseconds: 5 * NSEC_PER_SEC)
                    showingAlert = true
                }
            }
        }
        .sheet(isPresented: $showingSheet) {
            Text("Sheet")
        }
        .alert("Alert", isPresented: $showingAlert) {}
    }
}

分组和独占控制

import SwiftUI
import ExclusivePresentationState

struct ContentView: View {
    @ExclusivePresentationState(group: "A", priority: .low) private var showingSheetA = false
    @ExclusivePresentationState(group: "B", priority: .medium) private var showingSheetB = false
    
    var body: some View {
        VStack {
            Button("Show parent sheet of A") {
                showingSheetA = true
            }
            
            Button("Show sheet of B with delay") {
                Task {
                    try? await Task.sleep(nanoseconds: 5 * NSEC_PER_SEC)
                    showingSheetB = true
                }
            }
        }
        .sheet(isPresented: $showingSheetA) {
            ChildView()
        }
        .sheet(isPresented: $showingSheetB) {
            Text("Sheet B")
        }
    }
}

struct ChildView: View {
    @ExclusivePresentationState(group: "A", priority: .low) private var showingSheet = false

    var body: some View {
        Button("Show child sheet of A") {
            showingSheet = true
        }
        .sheet(isPresented: $showingSheet) {
            Text("Sheet A")
        }
    }
}

ExclusivePresentationStateContainer

import SwiftUI
import ExclusivePresentationState

struct ContentView: View {
    @ExclusivePresentationState(priority: .low) private var showingSheet = false

    var body: some View {
        VStack {
            Button("Show sheet") {
                showingSheet = true
            }

            Button("Dismiss all low priority sheets") {
                ExclusivePresentationStateContainer.dismissAll(where: { $0 == .low })
            }
        }
        .sheet(isPresented: $showingSheet) {
            Text("Sheet")
        }
    }
}

GitHub

查看 Github