前言
-
最近在开发一个需求时遇到如下代码,代码中是在一个子视图内需要与父视图进行数据交互,但是这种方式只能在特定的场景下使用,也必须确定视图层级才能有效,很容易出现superview.superview.superview......的情况,后面万一视图层级发生改变,很容易导致出现相关bug
传统的iOS的对象间交互模式有如下几种:直接property传值、delegate、KVO、通知、block、protocol、多态、Target-Action
如果用传统的交互模式把上面的代码改写,最常使用的就是delegate与block,但是遇到层级较多的情况,可能就需要把delegate或block层层传递,比较麻烦,有没有更方便的实现方式呢?
换一种优雅的实现方式
通过.superview.superview.superview....发现,这些视图其实都在同一个ResponderChain内,我们其实可以直接利用系统的ResponderChain机制,帮我们实现数据交互
-
实现方式也很简单,只需要增加一个extension
-
使用方式
- 发送事件端:
- 调用
self
.routerEventWithName(eventName: MiniAppShareContent_Confirm, userInfo:
nil
)
- 调用
-
接收事件端:
- 发送事件端:
-
中间层拦截处理完事件后,传递给最终需要刷新的外层页面,如下
-
这种方式的优点
- 复杂UI层级的页面中,可以避免无谓的delegate声明,也不需要管中间有多少层级,可以直接把交互事件与参数传递出来,方便快捷
- 众多自定义事件都通过这种方式做了传递,就使得事件处理的逻辑得到归拢。在这个方法内下断点就能管理所有的事件处理
-
这种方式的局限性
- 只能对存在于Reponder Chain上的UIResponder对象起作用。(如果同层交互,其实也能通过中间路由进行事件统一分发与处理,就不在本次讨论范围了)