JHPopupQueue 0.0.2beta

JHPopupQueue 0.0.2beta

JeffreyHu 维护。



JHPopupQueue 0.0.2beta

  • 作者:
  • huangliangliang

PopupQueue

弹框事件队列

  • 使用 Swift
  • iOS 10.0, Swift 4.0+

使用 CocoaPods

pod 'JHPopupQueue'

文档

PopupRequirement

这是我们的核心 protocol,所有需要进行队列管理的弹框事件都需要实现该 protocol

public protocol PopupRequirement {
  var popupName: String { get }
  var priority: Int { get } // 弹框的优先级
  var container: PopContainer? { set get }
  var popupStatus: PopupStatus? { set get }
  var selfMaintain: Bool { get }  // 业务方自行维护重复弹出问题

  mutating func show()
}

PopupStatus

public enum PopupStatus {
  case ready
  case willShow
  case showing
  case over
}
  • ready: 初始状态,注册时就会设置成该状态
  • willShow: 触发了对应弹框的 show 操作,即将弹出
  • showing: 正在弹出
  • over: 弹框结束了

PopContainer

public enum PopContainer {
  case viewController(container: UIViewController)
  case window
}

应该执行的弹出框位置,可以指定页面,也可以设置为 window,可以任意页面弹出

使用说明

1. 实现 PopupRequirement 协议

class DemoAlert1: PopupRequirement {
  var selfMaintain: Bool {
    return false
  }

  var popupStatus: PopupStatus?

  var popupName: String {
    return "DemoAlert1"
  }

  var priority: Int {
    return 100
  }

  var container: PopContainer?

  func show() {
    guard popupStatus == .willShow else {
      return
    }

    guard let topMost = UIViewController.topMost else {
      return
    }

    let alertController = UIAlertController(title: "Alert1", message: "This is an alert.", preferredStyle: .alert)
    let okAction = UIAlertAction(title: "OK", style: .default) { _ in
      print("You've pressed default")
      PopupManager.shared.next()
    }
    alertController.addAction(okAction)
    topMost.present(alertController, animated: true) {
      self.popupStatus = .showing
    }
  }
}

2. 注册加入 PopupQueue

PopupManager.shared.register(popup: DemoAlert1(), in: .viewController(container: self))

3. 结束弹框事件

关闭弹框时需要主动触发:

PopupManager.shared.next()

4. 在 viewDidAppear 中进行轮询

PopupManager.shared.poll()

5. 在 viewWillDisappear 中进行暂停

PopupManager.shared.pause()

6. 注意点:

  • 对话框弹出后状态设置为 .showing,例如
topMost.present(alertController, animated: true) {
  self.popupStatus = .showing
}
  • 如果对话框是异步弹出,请在弹出前进行检查状态,例如:
guard popupStatus == .willShow else {
  return
}
  • 对话框类型没有特定要求,可以是当地时间控制器,自定义视图,音频播放器等等,只要属于弹出事件都可以
  • 如果将 selfMaintain 设置为 true,则除非主动调用 PopupManager.shared.next(),PopupQueue 才会将其移除,并执行下一个对话框事件
  • 更多示例请参考工程 Demo