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回调的方式。文章不精髓,只希望能够记下自己学习的点滴并以最简单的形式分享出来。若有不当之处,请指出。

时间: 2024-10-03 22:15:40

ReactiveCocoa之UI篇的相关文章

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

前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,小编看了很多篇都没看出怎么使用ReactiveCocoa,于是决定自己写一遍关于学习ReactiveCocoa的文章,本文主要针对如何从零开始学习ReactiveCocoa,这里非常感谢3个人(支点的雷纯锋,camera360的宋潘,以及我的小学弟何宗柱(我爱科技)),在我研究ReactiveCocoa对我的帮助.如果喜欢我

最快让你上手ReactiveCocoa之基础篇

前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,小编看了很多篇都没看出怎么使用ReactiveCocoa,于是决定自己写一遍关于学习ReactiveCocoa的文章,本文主要针对如何从零开始学习ReactiveCocoa,这里非常感谢3个人(支点的雷纯锋,camera360的宋潘,以及我的小学弟何宗柱(我爱科技)),在我研究ReactiveCocoa对我的帮助.如果喜欢我

最快让你上手ReactiveCocoa之进阶篇

前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+ReactiveCocoa实战开发.如果喜欢我的文章,可以关注我,微博:袁峥Seemygo,欢迎交流.也可以来小码哥,了解下我们的iOS培训课程.之后还会更新 1.ReactiveCocoa常见操作方法介绍. 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImageNamed-Xcode-master 提供快速创建自动注释:VVDocumenter-Xcode-master 2.使用介绍: (1)KSImageNamed-Xcode-master的使用 安装该插件后,会对文件中图片进行智能提示. (2)VVDocumenter-Xcode-master能提供

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcarsgroup.h // 07-汽车展示(高级) // // Created by apple on 14-5-28. // Copyright (c) 2014年 itcase. All rights reserved. // #import <Foundation/Foundation.h> @

iOS开发UI篇—实现UItableview控件数据刷新

iOS开发UI篇—实现UItableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运行界面: 点击选中行: 修改数据后自动刷新: 三.代码示例 数据模型部分: YYheros.h文件 // // YYheros.h // 10-英雄展示(数据刷新) // // Created by apple on 14-5-29. // Copyright (c) 2014年 itcase. A

iOS开发UI篇—UITableviewcell的性能优化和缓存机制

iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource的 tableView:cellForRowAtIndexPath:方法来初始化每?行 UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图 辅助指示视图的作?是显示一个表示动作的

iOS开发UI篇—UITableview控件基本使

iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> @interface NJHero : NSObject /** * 头像 */ @property (nonatomic, copy) NSString *icon; /** * 名称 */ @property (nonatomic, copy) NSString *name; /** * 描述 */ @

iOS开发UI篇—xib的简单使用

iOS开发UI篇—xib的简单使用 一.简单介绍 xib和storyboard的比较,一个轻量级一个重量级. 共同点: 都用来描述软件界面 都用Interface Builder工具来编辑 不同点: Xib是轻量级的,用来描述局部的UI界面 Storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系 二.xib的简单使用 1.建立xib文件 建立的xib文件命名为appxib.xib 2.对xib进行设置 根据程序的需要,这里把view调整为自由布局 建立vie