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

相关推荐
咩咩啃树皮5 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny5 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹5 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny6 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
wangruofeng6 小时前
opencodex 解锁 Codex 任意模型,一个本地代理打通 Claude/Kimi/GLM/DeepSeek
llm·github·openai
小林ixn6 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker7 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜7 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康7 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木8 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github