前言:

上一篇讲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篇相关推荐

  1. 最快让你上手ReactiveCocoa之进阶篇

    前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+Rea ...

  2. 最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,小编看了很多篇都没看出怎么 ...

  3. 【转】最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,小编看了很多篇都没看出怎么 ...

  4. iOS开发UI篇—transframe属性(形变)

    iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...

  5. android点击展开textview,《Android APP可能有的东西》之UI篇:展开TextView全文

    前言 就像朋友圈里面那样的点击查看全文效果,很有可能是在项目中也会遇到.这里给出不实用自定义控件的方法,原理很简单,代码量也不大,可以直接复制粘贴到自己的项目...... 上效果图 我是图 看起来十分 ...

  6. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  7. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  8. [分享]iOS开发-UI篇:CAlayer层的属性

    iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

  9. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇-简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  10. iOS开发UI篇—实现UITableview控件数据刷新

    iOS开发UI篇-实现UITableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...

最新文章

  1. 【php】运算符优先级界定
  2. 关于SQL Server 2017中使用json传参时解析遇到的多层解析问题
  3. anaconda安装scrapy报错解决办法
  4. CENTOS手动安装修复python ,YUM CENTOS手动安装修复YUM
  5. 方便食品直接上菜 自嗨锅和西贝哪来的勇气?
  6. 二:java语法基础:
  7. 知名Node.js组件存在代码注入漏洞
  8. 量子计算机 真假,复原乳到底有没有营养?量子计算机是否已拍死“前浪”?“科学”流言榜告诉你真假...
  9. JAVA:事件监听器之练习
  10. Ext.gridPanel中内容对齐
  11. 1.bootstrapTable data-table
  12. 批量翻译软件免费【2022最新版】
  13. cmdn(聪明的女人)
  14. ArcGIS Pro地理配准
  15. 项目杂识-FOV(视场角)
  16. elementUI Tree组件实现双击事件
  17. cocos2dx 2.2 安装跟以往的不同
  18. 第2章 - 论题和结论是什么 (了解论题)
  19. 【优化选址】基于模拟退火结合粒子群算法求解分布式电源定容选址问题matlab源码
  20. mac 版webstorm 破解终极版本

热门文章

  1. 访问网站403错误解决方法(apache)
  2. Regex Tester 安装教程
  3. [转]怎么查看端口占用情况?
  4. web developer tips (56):手动更新JScript的智能感知
  5. cornerstone 使用
  6. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
  7. 多线程CountDownLatch和Join
  8. Jobdu 1005
  9. ASP.NET身份验证机制membership入门——API篇
  10. 为Struts 2.0做好准备