ReactiveCocoa之UI篇
前言:
上一篇讲ReactiveCocoa是函数响应式编程,并将多种事件响应的方式统一起来,使得不同的事件响应方式高度统一。同时也讲了ReactiveCocoa框架里面常见的几个概念。接下来基于那几个概念来看看UI开发中的几个应用。
实战:
1,替换了UIButton的target-Action:
[[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {
NSLog(@"点击了button");
}];
到rac_signalForControlEvents方法里面查看这个方法做的操作:
- (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents {
@weakify(self);
return [[RACSignal
createSignal:^(id<RACSubscriber> subscriber) {
@strongify(self);
[self addTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents];
[self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{
[subscriber sendCompleted];
}]];
return [RACDisposable disposableWithBlock:^{
@strongify(self);
[self removeTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents];
}];
}]
setNameWithFormat:@"%@ -rac_signalForControlEvents: %lx", RACDescription(self), (unsigned long)controlEvents];
}
可以看到创建了一个RACSignal信号并在block回调的时候执行操作为按钮添加了监听。此方法返回一个RACSignal信号,同时我们在外界调用subscribeNext订阅这个信号,当点击按钮的时候调用sendNext方法发送值出来就回调了subscribeNext的block。
2,绑定textView的监听(使用textfield同样的道理)
[self.myTextView.rac_textSignal subscribeNext:^(id x) {
NSLog(@"输出:%@",x);
}];
3,绑定手势:
UITapGestureRecognizer *tap = [UITapGestureRecognizer new];
[self.redView addGestureRecognizer:tap];
[tap.rac_gestureSignal subscribeNext:^(id x) {
NSLog(@"点击了红色的view");
}];
可以感到一些比较平常的UI控件基于 ReactiveCocoa上使用起来还是比较简单的,这里值得说一下的是当UI控件是代理方式来监听响应过程的时候。比如UIImagePicker。下面代码实现一个简单的小功能,点击按钮选择图片,图片选择好了之后显示在UIImageView上面。
4,替换UI控件的代理回调:
[[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {
//点击按钮弹出UIImagePicker
self.imagePicker = [UIImagePickerController new];
[self.imagePicker.rac_imageSelectedSignal subscribeNext:^(id x) {
//该block回调是在照片选择完成的时候调用
NSLog(@"%@",x);
NSDictionary *dic = (NSDictionary *)x;
self.myImageView.image = dic[@"UIImagePickerControllerOriginalImage"];
[self.imagePicker dismissViewControllerAnimated:YES completion:nil];
}];
//rac_delegateproxy是RAC下的代理属性,这行代码可以理解为,RAC下的代理将会执行block回调替换之前的代理去执行imagePickerControllerDidCancel方法
[[self.imagePicker.rac_delegateProxy signalForSelector:@selector(imagePickerControllerDidCancel:)] subscribeNext:^(id x) {
//该block调用时候:当delegate要执行imagePickerControllerDidCancel
[self.imagePicker dismissViewControllerAnimated:YES completion:nil];
}];
[self presentViewController:self.imagePicker animated:YES completion:nil]; }];
5,RAC下的通知:
第一个页面注册通知:
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"ChangeColor" object:nil] subscribeNext:^(id x) {
NSNotification *notification = (NSNotification *)x;
NSLog(@"收到通知:%@",notification.object);
self.view.backgroundColor = (UIColor *)notification.object;
}];
第二个页面中返回按钮发送通知:
[[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回调的方式。文章不精髓,只希望能够记下自己学习的点滴并以最简单的形式分享出来。若有不当之处,请指出。
ReactiveCocoa之UI篇的更多相关文章
- 最快让你上手ReactiveCocoa之进阶篇
前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+Rea ...
- 上手ReactiveCocoa之基础篇
转自 --> http://www.jianshu.com/p/87ef6720a096 前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCoco ...
- iOS开发UI篇—CAlayer(自定义layer)
iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
- iOS开发UI篇—懒加载
iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- iOS开发UI篇—CAlayer层的属性
iOS开发UI篇—CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...
- iOS开发UI篇—CAlayer(创建图层)
iOS开发UI篇—CAlayer(创建图层) 一.添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控 ...
- iOS开发UI篇—CALayer简介
iOS开发UI篇—CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...
- iOS开发UI篇—核心动画(UIView封装动画)
iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...
随机推荐
- 2014 网选 上海赛区 hdu 5047 Sawtooth
题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个 ...
- android小技巧和注意事项
在listView 或者 gridView 的使用中,通常不仅仅为了展现数据,更多的是操作数据.于是当控件重合在一起时,我们需要添加事件.就会出现一个问题,当点击一个控件和长按这个控件时,常常出现长按 ...
- 开放产品开发(OPD):产品负责人的工作原则和方法
月26日我将在2014 WOT全球软件技术峰会做相关的一个主题演讲[产品负责人的工作原则和方法],个原则和相应的一些方法. 以下是本次分享内容: 完整版如下,如果你喜欢想下载的话,点击 http:// ...
- BABOK2主要概要输入输出图
- 工作流数据库表设计-ASP.NET
公司准备开发一套工作流引擎,以前没有什么OA开发经验,也是第一次设计工作流引擎,我把我的一些思路分享一下,希望得到些帮助或者能帮助到一些人. 产品的定位: 1.能够做到前后端分离 2.可以做到项目的分 ...
- C++中的静态绑定和动态绑定
C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分.我是在一个类的继承体系中分析的,因此下面所说的对象一般就是指一个类的实例.首先我们需要明确几个名词定义: 静态类型: ...
- [Architect] ABP(现代ASP.NET样板开发框架) 翻译
所有翻译文档,将上传word文档至GitHub 本节目录: 简介 代码示例 支持的功能 GitHub 简介 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目) ...
- [爬虫学习笔记]基于Bloom Filter的url去重模块UrlSeen
Url Seen用来做url去重.对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键.因为大的爬虫系统可能一秒钟就会下载 ...
- C#-Windows服務以LocalSystem賬戶安裝的話無法獲取我的文檔路徑
如圖,如果Window服務以上圖 Account安裝運行,則無法獲取到 以下路徑: System.Environment.GetFolderPath(Environment.SpecialFolder ...
- 怎样在C#中从数据库中读取数据(数据读取器)
实现在C#中通过语句,查询数据库中的数据 SqlConnection con = null; //创建SqlConnection 的对象 try //try里面放可能出现错误的代码 ...