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