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