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

相关推荐
swipe27 分钟前
为什么 RAG 一定离不开向量检索:从文档向量化到语义搜索的工程实现
前端·llm·agent
OpenTiny社区1 小时前
AI-Extension:让 AI 真的「看得到、动得了」你的浏览器
前端·ai编程·mcp
IT_陈寒1 小时前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端
农夫山泉不太甜2 小时前
Tauri v2 实战代码示例
前端
RickeyBoy2 小时前
独立 App 配置阿里云 CDN 记录
ios
yuhaiqiang2 小时前
被 AI 忽悠后,开始怀念搜索引擎了?
前端·后端·面试
量子位2 小时前
字节版龙虾架构火爆GitHub!开源获35k+ Star,内置Skill全家桶,原生适配飞书
github·ai编程
红色石头本尊3 小时前
1-umi-前端工程化搭建
前端
真夜3 小时前
关于对echart盒子设置百分比读取的宽高没有撑开盒子解决方案
前端
楠木6853 小时前
RAG 资料库 Demo 完整开发流程
前端·ai编程