ReactiveCocoa之UI篇
前言:
上一篇讲ReactiveCocoa是函数响应式编程,并将多种事件响应的方式统一起来,使得不同的事件响应方式高度统一。同时也讲了ReactiveCocoa框架里面常见的几个概念。接下来基于那几个概念来看看UI开发中的几个应用。
实战:
1,替换了UIButton的target-Action:
1 [[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) { 2 NSLog(@"点击了button"); 3 }];
到rac_signalForControlEvents方法里面查看这个方法做的操作:
1 - (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents { 2 @weakify(self); 3 4 return [[RACSignal 5 createSignal:^(id<RACSubscriber> subscriber) { 6 @strongify(self); 7 8 [self addTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; 9 [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ 10 [subscriber sendCompleted]; 11 }]]; 12 13 return [RACDisposable disposableWithBlock:^{ 14 @strongify(self); 15 [self removeTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; 16 }]; 17 }] 18 setNameWithFormat:@"%@ -rac_signalForControlEvents: %lx", RACDescription(self), (unsigned long)controlEvents]; 19 }
可以看到创建了一个RACSignal信号并在block回调的时候执行操作为按钮添加了监听。此方法返回一个RACSignal信号,同时我们在外界调用subscribeNext订阅这个信号,当点击按钮的时候调用sendNext方法发送值出来就回调了subscribeNext的block。
2,绑定textView的监听(使用textfield同样的道理)
1 [self.myTextView.rac_textSignal subscribeNext:^(id x) { 2 NSLog(@"输出:%@",x); 3 }];
3,绑定手势:
1 UITapGestureRecognizer *tap = [UITapGestureRecognizer new]; 2 [self.redView addGestureRecognizer:tap]; 3 [tap.rac_gestureSignal subscribeNext:^(id x) { 4 NSLog(@"点击了红色的view"); 5 }];
可以感到一些比较平常的UI控件基于 ReactiveCocoa上使用起来还是比较简单的,这里值得说一下的是当UI控件是代理方式来监听响应过程的时候。比如UIImagePicker。下面代码实现一个简单的小功能,点击按钮选择图片,图片选择好了之后显示在UIImageView上面。
4,替换UI控件的代理回调:
1 [[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) { 2 3 //点击按钮弹出UIImagePicker 4 self.imagePicker = [UIImagePickerController new]; 5 [self.imagePicker.rac_imageSelectedSignal subscribeNext:^(id x) { 6 //该block回调是在照片选择完成的时候调用 7 NSLog(@"%@",x); 8 NSDictionary *dic = (NSDictionary *)x; 9 self.myImageView.image = dic[@"UIImagePickerControllerOriginalImage"]; 10 [self.imagePicker dismissViewControllerAnimated:YES completion:nil]; 11 }]; 12 //rac_delegateproxy是RAC下的代理属性,这行代码可以理解为,RAC下的代理将会执行block回调替换之前的代理去执行imagePickerControllerDidCancel方法
13 [[self.imagePicker.rac_delegateProxy signalForSelector:@selector(imagePickerControllerDidCancel:)] subscribeNext:^(id x) { 14 //该block调用时候:当delegate要执行imagePickerControllerDidCancel 15 [self.imagePicker dismissViewControllerAnimated:YES completion:nil]; 16 }]; 17 18 [self presentViewController:self.imagePicker animated:YES completion:nil]; 19 20 21 }];
5,RAC下的通知:
第一个页面注册通知:
1 [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"ChangeColor" object:nil] subscribeNext:^(id x) { 2 NSNotification *notification = (NSNotification *)x; 3 NSLog(@"收到通知:%@",notification.object); 4 self.view.backgroundColor = (UIColor *)notification.object; 5 }];
第二个页面中返回按钮发送通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeColor" object:[UIColor grayColor]];
6,RAC下的观察者设计模式:
currentValue是视图控制器拥有的一个Int类型的属性.观察该属性的变化
[[self rac_valuesAndChangesForKeyPath:@"currentValue" options:(NSKeyValueObservingOptionNew) observer:self] subscribeNext:^(id x) {//解包元组,会把元组里面的值按顺序给变量赋值 RACTupleUnpack(NSString *kind,NSString *new) = x;NSLog(@"观察到currentValue的值发生改变,现在的value等于%@,%@",kind,new);}];
按钮点击改变currentValue的值
[[self.valueButton rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {self.currentValue ++;}];
源代码地址:https://github.com/SZT0728/ReactiveCocoaProgram
可以看到RAC下的UI高度统一了多种事件响应成block回调的方式。文章不精髓,只希望能够记下自己学习的点滴并以最简单的形式分享出来。若有不当之处,请指出。
转载于:https://www.cnblogs.com/develop-SZT/p/5292622.html
ReactiveCocoa之UI篇相关推荐
- 最快让你上手ReactiveCocoa之进阶篇
前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+Rea ...
- 最快让你上手ReactiveCocoa之基础篇
前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,小编看了很多篇都没看出怎么 ...
- 【转】最快让你上手ReactiveCocoa之基础篇
前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,小编看了很多篇都没看出怎么 ...
- iOS开发UI篇—transframe属性(形变)
iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...
- android点击展开textview,《Android APP可能有的东西》之UI篇:展开TextView全文
前言 就像朋友圈里面那样的点击查看全文效果,很有可能是在项目中也会遇到.这里给出不实用自定义控件的方法,原理很简单,代码量也不大,可以直接复制粘贴到自己的项目...... 上效果图 我是图 看起来十分 ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
- iOS开发UI篇—UIWindow简单介绍
iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...
- [分享]iOS开发-UI篇:CAlayer层的属性
iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...
- iOS开发UI篇—简单介绍静态单元格的使用
iOS开发UI篇-简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...
- iOS开发UI篇—实现UITableview控件数据刷新
iOS开发UI篇-实现UITableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...
最新文章
- 【php】运算符优先级界定
- 关于SQL Server 2017中使用json传参时解析遇到的多层解析问题
- anaconda安装scrapy报错解决办法
- CENTOS手动安装修复python ,YUM
CENTOS手动安装修复YUM
- 方便食品直接上菜 自嗨锅和西贝哪来的勇气?
- 二:java语法基础:
- 知名Node.js组件存在代码注入漏洞
- 量子计算机 真假,复原乳到底有没有营养?量子计算机是否已拍死“前浪”?“科学”流言榜告诉你真假...
- JAVA:事件监听器之练习
- Ext.gridPanel中内容对齐
- 1.bootstrapTable data-table
- 批量翻译软件免费【2022最新版】
- cmdn(聪明的女人)
- ArcGIS Pro地理配准
- 项目杂识-FOV(视场角)
- elementUI Tree组件实现双击事件
- cocos2dx 2.2 安装跟以往的不同
- 第2章 - 论题和结论是什么 (了解论题)
- 【优化选址】基于模拟退火结合粒子群算法求解分布式电源定容选址问题matlab源码
- mac 版webstorm 破解终极版本
热门文章
- 访问网站403错误解决方法(apache)
- Regex Tester 安装教程
- [转]怎么查看端口占用情况?
- web developer tips (56):手动更新JScript的智能感知
- cornerstone 使用
- JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
- 多线程CountDownLatch和Join
- Jobdu 1005
- ASP.NET身份验证机制membership入门——API篇
- 为Struts 2.0做好准备