一个管理项目中所有弹窗的弹窗管理器(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...

相关推荐
吹什么轩1 分钟前
constexpr 完全指南:从 const 的两种含义,到编译期计算的四次演进
java·前端·javascript
lpfasd1236 分钟前
2026年第44周GitHub趋势周报
github
qq_410960359 分钟前
GitHub Actions 为何适合定时任务调度?底层机
github
miofly20 分钟前
MIT 团队用 GPT-6 Astra 改写小模型权重,跳过梯度训练提升指令遵循能力
开源·github
Bruce_Liuxiaowei36 分钟前
前端校验登录态,等于没校验——一次应急广播终端高危漏洞的发现与报送
运维·前端·安全
Meta Luo42 分钟前
AI 时代,Web 自动化测试该怎么做?
前端·人工智能·playwright 替代工具·无代码自动化测试工具·低代码 ui 自动化测试·web 回归测试工具
逛逛GitHub44 分钟前
盘点 10 月份 19 个 Star 大涨的 GitHub 项目,第一个很有用。
github
去伪存真1 小时前
AI Agent 性能评估指标与自动化测试落地方案
前端·agent
茶底世界之下1 小时前
同一片泳池,清透还是奶油胶片?用 Awaking 做两版成片
ios
java_nnnn1 小时前
Spring Boot 配置文件详解:从基础语法到 YAML 配置
spring boot·后端·github