Date 一 19 五月 2014 Tags iOS

YRUISignal

==========


---若转载请注明出处- YueRuo's Blog - http://yueruo.github.io ---

开发中经常遇到类似的情况,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的启发,做了这个小工具类YRUISignal

这个工具类的使用很简单。比如说上面提到的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被add到界面上才有效,换句话说,如果这个view被removeFromSubview,则不能正确的传递信号出去。(不过你可以使用sendYRUISignal方法显式指明接受者,但是这样又有点多此一举了)
2.由于使用的是父view查找链,直至ViewController,因此如果两个view不在同一个controller上,也不能把事件传递过去。 3.这种方式个人觉得比通知简单一些,当然仁者见仁智者见智,目前Bee也是使用通知注册的方法去做的传递,但是接收处理上我们不太一致。

希望这里处理方式和思想能对大家有所帮助或者启发。


Comments

comments powered by Disqus