AlertReactor
AlertReactor 是 UIAlertController 的 ReactorKit 扩展。它提供了一种优雅的方式来处理 UIAlertController。最适合于需要懒加载警告操作的场景。
功能
✏️ 静态类型的警告操作🕹 响应式和动态的操作绑定
概览
这是对 AlertReactor
的一种示例实现
final class UserAlertReactor: AlertReactor<UserAlertAction> {
override func mutate(action: Action) -> Observable<Mutation> {
switch action {
case .prepare:
return .just(.setActions([.copy, .follow, .block, .cancel]))
case let .selectAction(alertAction):
switch alertAction {
case .copy: return foo()
case .follow: return foo()
case .unfollow: return foo()
case .block: return foo()
case .cancel: return foo()
}
}
}
}
入门指南
1. 定义警告动作
首先,您应该定义一个符合协议 AlertActionType
的新类型。这是 UIAlertAction
的抽象模型。该协议要求有 title
(必需)、style
(可选) 和 isEnabled
(可选) 属性。
enum UserAlertAction: AlertActionType {
case loading
case follow
case block
case cancel
// required
var title: String {
switch self {
case .loading: return "Loading"
case .follow: return "Follow"
case .block: return "Block"
case .cancel: return "Cancel"
}
}
// optional
var style: UIAlertActionStyle {
switch self {
case .loading: return .default
case .follow: return .default
case .block: return .destructive
case .cancel: return .cancel
}
}
// optional
var isEnabled: Bool {
switch self {
case .loading: return false
default: return true
}
}
}
2. 创建警告反应器
AlertReactor
是一个通用反应器类。它接受一个符合协议 AlertActionType
的单一定义类型。这个反应器提供了一个默认动作、突变和状态。以下是 AlertReactor
的简化定义。您可以通过继承此类并重写 mutate(action)
方法来实现特定的业务逻辑。
class AlertReactor<AlertAction: AlertActionType>: Reactor {
enum Action {
case prepare // on viewDidLoad()
case selectAction(AlertAction) // on select action
}
enum Mutation {
case setTitle(String?)
case setMessage(String?)
case setActions([AlertAction])
}
struct State {
public var title: String?
public var message: String?
public var actions: [AlertAction]
}
}
我们将使用 UserAlertAction
作为泛型参数来创建一个新的 AlertReactor
子类。
final class UserAlertReactor: AlertReactor<UserAlertAction> {
override func mutate(action: Action) -> Observable<Mutation> {
switch action {
case .prepare:
return .just(Mutation.setActions([.copy, .follow, .block, .cancel]))
case let .selectAction(alertAction):
switch alertAction {
case .loading: return .empty()
case .follow: return UserAPI.follow()
case .block: return UserAPI.block()
case .cancel: return .empty()
}
}
}
}
3. 展示警告控制器
AlertController
是一个继承自 UIAlertController
的子类,它符合 ReactorKit 的 View
协议。此类也接受一个符合 AlertActionType
的单一定义类型。您可以用一些可选参数初始化这个类:reactor
和 preferredStyle
。一旦展示,反应器将为您处理业务逻辑。
let reactor = UserAlertReactor()
let controller = AlertController<UserAlertAction>(reactor: reactor, preferredStyle: .actionSheet)
self.present(controller, animated: true, completion: nil)
安装
pod 'AlertReactor'
许可
AlertReactor 采用 MIT 许可。有关更多信息,请参阅LICENSE 文件。