AlertReactor 0.6.0

AlertReactor 0.6.0

测试已测试
Lang语言 SwiftSwift
许可 MIT
发布上次发布2019年6月
SPM支持 SPM

Suyeol Jeon维护。



 
依赖
ReactorKit>= 2.0.0
RxSwift~> 5.0
RxCocoa~> 5.0
 

  • 作者:
  • Suyeol Jeon

AlertReactor

Swift CocoaPods Build Status Codecov

AlertReactor 是 UIAlertController 的 ReactorKit 扩展。它提供了一种优雅的方式来处理 UIAlertController。最适合于需要懒加载警告操作的场景。

alertreactor

功能

  • ✏️静态类型的警告操作
  • 🕹响应式和动态的操作绑定

概览

这是对 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 的单一定义类型。您可以用一些可选参数初始化这个类:reactorpreferredStyle。一旦展示,反应器将为您处理业务逻辑。

let reactor = UserAlertReactor()
let controller = AlertController<UserAlertAction>(reactor: reactor, preferredStyle: .actionSheet)
self.present(controller, animated: true, completion: nil)

安装

pod 'AlertReactor'

许可

AlertReactor 采用 MIT 许可。有关更多信息,请参阅LICENSE 文件。