一个管理项目中所有弹窗的弹窗管理器(PopupManager)

基于什么原因 PopupManager 的产生?

现在有这么一个业务需求,需要在某个界面或者在 window 上面添加一个弹窗。这个时候在你的大脑中你会想到怎么样的实现方案呢?欢迎在下面的评论区说出你的方案。期待你们的回答😁

后面在需求迭代的过程中,在同一个界面就会出现不止一个弹窗的时候。这个时候你又会怎么处理这些弹窗的弹出顺序呢?欢迎在下面的评论区说出你的方案。期待你们的回答😁

改造之前的实现方式

单一的弹窗 ,我们就是直接通过自定义View 然后在当前的控制器弹出或者获取keyWindow 然后添加弹窗。
多弹窗 的时候就会通过一堆的 BOOL 值做标志,然后在弹出之前做了一堆的逻辑判断,来判断当前应该弹出某一个弹窗。

这样的实现方式,对于一个人一直负责的业务可能会实现起来简单一些,但是在人员交替的时候,会让后面的人对逻辑代码产生很多困惑。所以我们就在想这个要怎么去做一些改造。

改造

我们一开始的思路就是项目中的所有弹窗都由一个单例来控制,把所有需要添加的弹窗存放在一个数组中,在需要弹出的时候取出第一个弹窗,然后统一的在 keyWindow 上添加。如果已经有弹窗的时候,就会不会添加弹窗。

遇到的问题---1.弹窗显示的在哪个界面

首先把弹窗都添加在 keyWindow 上的时候,有的业务逻辑是不需要的。所以我们就增加了一个targetViewControllerClasses 的属性,用来告诉管理器,你是要在哪个控制器显示弹窗。这样,每一个弹窗就有了自己应该显示的控制器。

遇到的问题---2.弹窗有可能会有显顺序的调整

这个出现的时机是因为,项目中弹窗的数据都是后台给的,但是会分布在不同的接口返回的。如果是统一接口那么可以用数据返回的顺序来控制弹出的顺序,但是这样的方案明显是不实际的。后面在再看了很多成熟的方案后,我们也和后台商量对项目中的所有弹窗增加优先级的属性。

我们就一开始存储弹窗的数组进行逻辑调整,对数组中的数据基于优先级的大小做了从大到小的排序,这样就可以优先弹出啊优先级高的弹窗,如果优先级相同的时候就是看先进入数组的会先弹出。这样就保证了项目中的一个简单需求。

示例

自己实现的弹窗都要遵循我们的<PopupProtocol>协议,那么现在做个简单示例。

objc 复制代码
PopupView *popupViewFirst1 = [[PopupView alloc] initWithPopupPriority:5 message:@"等待的弹窗 优先级为5"];
[PopupManager.sharedManager addPopupView:popupViewFirst1];

传送门github.com/cAibDe/Popu...

相关推荐
子兮曰19 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰20 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万20 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝20 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋20 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁21 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
lpfasd1231 天前
2026年第38周GitHub趋势周报
python·科技·github
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
u1301301 天前
GitHub 热榜项目:日榜(2026-09-21)
人工智能·github
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端