Toaster

workflow codecov

Toaster 是一个轻量级的 SwiftUI 库,用于在你的 iOS 应用中呈现 Toast 消息。它提供了一种简单且可定制的方式向用户显示临时通知。

特性

安装

要在你的 SwiftUI 项目中使用 Toaster,只需将 Toaster 包作为依赖项添加到你的 Package.swift 文件中即可。

dependencies: [
    .package(url: "https://github.com/DarthRumata/Toaster.git", from: "0.4.0")
]

用法

要呈现 Toast 消息,你可以在你的 SwiftUI 视图上使用 toastView 修饰符。 Toaster 提供了 toastView 修饰符的多种变体,具体取决于你的用例。

预定义的 Toast

你可以使用 toastView(toast:) 修饰符显示预定义的 Toast。 它接受一个绑定到 Toast 对象的绑定作为输入。

struct ContentView: View {
    @State var error: Error?
    
    var body: some View {
        let errorBinding = Binding<Toast?>(get: {
            if error != nil {
                return Toast(message: "An error occurred", style: .error)
            }
            return nil
        }, set: { newValue in
            if newValue == nil {
                error = nil
            }
        })
        
        VStack {
            // Your view content
            
            Button("Show Error Toast") {
                error = MyCustomError()
            }
        }
        .toastView(toast: errorBinding)
    }
}

自定义 Toast

如果想要呈现自定义的 Toast 视图,可以使用 toastView(isPresented:view:) 修饰符。 它接受一个绑定到布尔值的绑定,该布尔值指示 Toast 呈现状态,以及一个返回自定义 Toast 视图的闭包。

struct ContentView: View {
    @State var isToastPresented = false
    
    var body: some View {
        VStack {
            // Your view content
            
            Button("Show Custom Toast") {
                isToastPresented = true
            }
        }
        .toastView(isPresented: $isToastPresented) {
            CustomToastView()
        }
    }
}

调度器

要手动控制 Toast 消息的呈现,可以使用 ToastScheduler 类。 你可以创建一个调度器实例,并将其传递给 toastView(scheduler:) 修饰符。

class ViewModel: ObservableObject {
    private(set) var toastScheduler = ToastScheduler()
}

struct ContentView: View {
    @StateObject var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            // Your view content
            
            Button("Schedule Toast") {
                viewModel.toastScheduler.present(CustomToastView(), dismissDelay: 3)
            }
        }
        .toastView(scheduler: viewModel.toastScheduler)
    }
}