BeeFramework 笔记 四(UISignal 总结)
http://yang152412.blog.163.com/blog/static/175861582201332321351862/
一、UISignal的工作模式
1、发送Signal,比如从ViewController的loadView和ViewDidLoad方法,Button的touch方法,view更改frame的方法。
在框架中, 系统的 loadView和ViewDidLoad方法,Button的touch方法 大部分都在 封装的 类中实现,子类没有实现,通过signal来回调到子类。
[self sendUISignal:BeeUIButton.TOUCH_DOWN];
2、在UIView的扩展类或者 UIViewController扩展类 中 生成 对应的Signal
- (BeeUISignal *)sendUISignal:(NSString *)name
{
return [self sendUISignal:name withObject:nil from:self];
}
- (BeeUISignal *)sendUISignal:(NSString *)name withObject:(NSObject *)object
{
return [self sendUISignal:name withObject:object from:self];
}
- (BeeUISignal *)sendUISignal:(NSString *)name withObject:(NSObject *)object from:(id)source{
BeeUISignal * signal = [[[BeeUISignal alloc] init] autorelease];
if ( signal )
{
NSString * selName = self.tagString.lowercaseString;
selName = [selName stringByReplacingOccurrencesOfString:@"-" withString:@"_"];
// selName = [selName stringByReplacingOccurrencesOfString:@":" withString:@"_"];
signal.preSelector = selName; // v0.3.0 new feature, signal binding
signal.source = source ? source : self;
signal.target = self;
signal.name = name;
signal.object = object;
[signal send];
}
return signal;
}
2、[signal send]; 生成的signal 调用send方法,来传递 该signal
在 send 方法里面,解析 传递的 name,判断source 是不是 发送消息类的子类。更新 foreign, _callPath,_sendTimeStamp,_reach,_jump 等属性。然后调用 routes方法。
3、在 - (void)routes; 方法里面,根据 signal 的 name,target,判断 target 是否实现了 响应方法,
NSString * clazz = (NSString *)[array objectAtIndex:1];
NSString * method = (NSString *)[array objectAtIndex:2];
NSObject * targetObject = _target;
if ( [_target isKindOfClass:[UIView class]] )
{
UIViewController * viewController = [(UIView *)_target viewController];
if ( viewController )
{
targetObject = viewController;
}
}
#if defined(__BEE_SELECTOR_STYLE2__) && __BEE_SELECTOR_STYLE2__
{
NSString * selectorName;
SEL selector;
selectorName = [NSString stringWithFormat:@"handleUISignal_%@_%@:", clazz, method];
selector = NSSelectorFromString(selectorName);
if ( [targetObject respondsToSelector:selector] )
{
[targetObject performSelector:selector withObject:self];
return;
}
selectorName = [NSString stringWithFormat:@"handleUISignal_%@:", clazz];
selector = NSSelectorFromString(selectorName);
if ( [targetObject respondsToSelector:selector] )
{
[targetObject performSelector:selector withObject:self];
return;
}
}
#endif // #if defined(__BEE_SELECTOR_STYLE2__) && __BEE_SELECTOR_STYLE2__
#if defined(__BEE_SELECTOR_STYLE1__) && __BEE_SELECTOR_STYLE1__
{
NSString * selectorName;
SEL selector;
selectorName = [NSString stringWithFormat:@"handle%@:", clazz];
selector = NSSelectorFromString(selectorName);
if ( [targetObject respondsToSelector:selector] )
{
[targetObject performSelector:selector withObject:self];
return;
}
如果都没有实现,则 遍历 父类 有没有实现,如果父类没有实现,则 判断 _target 是否响应 handleUISignal:方法,如果实现(应该总是有的,因为 所有view控件的父类总是UIView,而框架 扩展UIView类:UIView(BeeUISignal) 里面实现了方法,
- (void)handleUISignal:(BeeUISignal *)signal
{
if ( self.superview )
{
[signal forward:self.superview];
}
else
{
signal.reach = YES;
#if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
CC( @"[%@] > %@", signal.name, signal.callPath );
#endif // #if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
}
}
BeeUIButton 的触法事件 Signal 的 callPath,从上到下 依次 遍历,直到找到 实现响应方法。
[signal.BeeUIButton.TOUCH_DOWN] > BeeUIButton > Lesson2View2 > Lesson2View1 > BeeUIBoardView > Lesson2Board
和UIView+BeeUISignal 类似,UIVIewController的扩展类 也实现了 最基本的 响应方法,一遍 BeeUISignal的 routes方法 最后的判断做处理。只是没有了 判断 view是否有 superview。
- (void)handleUISignal:(BeeUISignal *)signal
{
signal.reach = YES;
#if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
CC( @"[%@] > %@", signal.name, signal.callPath );
#endif // #if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
}
DEF_SIGNAL( TEST )
@end
[_innerView addSignal:Lesson2View2.TEST forControlEvents:UIControlEventTouchUpInside];
BeeFramework 笔记 四(UISignal 总结)的更多相关文章
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Java学习笔记四---打包成双击可运行的jar文件
写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...
- Java加密与解密笔记(四) 高级应用
术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Django开发笔记四
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...
随机推荐
- VUE前端无法启动
cd 到client中,使用npm run dev ,一直卡着也不报错,启动不了项目 可以直接使用 ,需要进入root目录进行 cnpm install npm -g
- 2,MongoDB之增删改查及pymongo的使用
本章我们来学习一下关于 MongoDB的增删改查 一.MongoDB操作 之 原生ORM,根本不存在SQL语句 创建数据库:这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间 是的,Mong ...
- 挂个AC自动机
struct ACM{ ],f[N],cnt[N]; int sz,rt; int ins(char *s){ int n=strlen(s),u=rt; ;i<n;i++){ int c=s[ ...
- Pycharm的使用一
一.编辑器的选择 Python 的学习过程少不了集成开发环境(IDE)或者代码编辑器,这些 Python 开发工具帮助开发者加快使用 Python 开发的速度,提高效率. 高效的代码编辑器或者 IDE ...
- Python 模块:random 随机数生成
Python中的random模块用于生成随机数. 使用该模块之前需要 import random 几个常用的函数用法: 1.random.random 函数原型: random.random() 用于 ...
- HTML DOM简易学习笔记
文字版:https://github.com/songzhenhua/github/blob/master/HTML DOM简易学习笔记.txt 学习地址:http://www.w3school.co ...
- Python 3基础教程2-打印语句和字符串
本文介绍Python 3中的打印语句和字符串使用,具体练习请看下面的demo.py print ('Hello Python 3!') """文本讲打印语句和字符串打印语 ...
- neutron floating ip 限速
查看浮动ip的id [root@10e131e69e14 oz]# openstack floating ip show 36.111.0.197 +---------------------+--- ...
- Android Service完全解析
Service的基本用法 1.新建一个Android项目,新建一个MyService继承自Service,并重写父类的onCreate(),onStartCommand()方法和onDestory() ...
- class内部处理
class A { public: int foo( ) { return val ; } static int staFun( ) { return staVal ; } static int st ...