帮助获取 UI 操作信号
支持 pod
pod 'YRUISignal'
开发中经常遇到类似的情况,viewController 上贴了 view1,view1 上贴了 view2,view2 上贴了 view3...
(如下所示)
viewController
-----view1
------view2
------view3
如果在 view3 上触发了一个事件,需要在 view1 或 viewController 中处理,按照一般的处理方式,你需要:
1.在 view3 上做好 protocol,或进行 block 回调
2.把事件传递给上一个界面(对于 view3 来说就是传递给 view2)
3.view2 再次重复 1-2 的步骤,直到到达相应的界面为止。
如果这个 view 的层级很深。。。。你或许就不愿意这样做了。。。
还好我们有替代方案:使用通知处理,view3 上发送通知,在 viewController 中先注册通知,然后处理它。恩恩,比上面的方法简单多了,但是我们继续思考,是否每个微小的 UI 事件都需要使用全局的通知呢?
这方面我受到 Touch 事件的链式响应处理以及早期 BeeFramework 中的 Signal 的启发,制作了这个小工具类。
这个工具类的使用很简单。比如上面提到的 view3 触发事件,viewController 处理,只需两步:
1.在 view3 触发事件时:
[self sendYRUISignalForKey:@"事件唯一名称"];
2.在 viewController 中实现 handleYRUISignal 方法
-(BOOL)handleYRUISignal:(YRUISignal *)signal{
if ([signal.name isEqualToString:@"事件唯一名称"]) {//能处理这个信号
return true;//根据需要中断响应链
}
return false;//不能处理(继续传递给下一个view)
}
搞定,是不是非常简单?
需要注意的是:
1.由于这种方式采用父 view 链式查找,因此仅当 view 被添加到界面上才有效,换句话说,如果这个 view 被 removeFromSubview,则无法正确传递信号出去。(不过你可以使用 sendYRUISignal 方法显式指定接收者,但这有点多此一举了)
2.由于使用父 view 查找链,直至 ViewController,因此如果两个 view 不在同一个 controller 上,也无法传递事件。3.这种方法个人觉得比通知简化一些,当然仁者见仁智者见智,目前 Bee 也是使用通知注册的方法进行传递,但接收处理上我们不太一致。
希望这里的处理方式和思考能对大家有所帮助或启发。