弹窗管理

313 阅读2分钟

前言:

从以下方面入手说明:
1、是什么
2、为什么需要
3、怎么实现

绝大多数app项目会有各种各样的弹窗,那么什么时候弹窗,怎么个弹出方式,以及如何避免重叠,带来了一系列的问题需要去解决。

这里引入了优先级、弹窗所在的场景、弹窗对应的自定义视图等概念。由自定义视图确定弹窗长什么样子;场景确定在哪里弹;优先级确定弹窗出现的顺序。确定了这些之后,那么如何去存储弹窗?;如何去控制弹窗的出现和消失?(数据层面的维护);如何控制弹窗出现和消失时附带的行为/事件?(交互层面);如何实现弹窗的动画?

一、是什么

弹窗是多个版本迭代下来积攒的产物,常见的有系统弹窗(系统权限),版本更新弹窗,活动弹窗(营销类的,有各种花样)

二、为什么需要

例如接手一个需求“砸金蛋”弹窗,需要在首页展示
首页已经管理了多个弹窗,包括弹窗的逻辑和顺序都放在了首页的viewcontroller中,通过各种条件判断弹窗的顺序,然而弹窗是异步的,不好控制。
弹窗之前是view,而不是viewcontroller,导致视觉和交互逻辑分离,不好管理弹窗的生命周期。
最重要的是随着弹窗的增多不好迭代

三、怎么实现

解决问题:

弹窗需要异步控制:

1.集合控制所有弹窗
2.代码的业务逻辑可以写在合适的地方,需要通过通知去触发弹窗入列,入列的逻辑写在首页viewcontroller中(与当前的场景一一对应)

弹窗需要优先级

  1. 数组控制,先进后出的原则(优先队列)
  2. 每次往集合中加入一个弹窗时,进行排序(按照优先级顺序)

弹窗需要分类存储

1.用多个集合管理(系统型、营销型、其他)

弹窗需要生命周期

1.用viewcontroller控制作为弹窗的容器,viewwillappear和viewwilldisappear获取弹窗的生命周期,可以在生命周期的节点做一些事情(例如:倒计时广告页展示弹窗时,需要在弹窗展示时处理定时器停止,弹窗关闭时重新开启定时器)

采用单例管理类对弹窗的集合进行控制(入列和出列,优先级比较)